栈之道:LIFO的简约之美

栈的本质与约束之美

栈是一种遵循**后进先出(LIFO)**原则的线性数据结构。这种看似简单的约束(仅允许在栈顶插入或删除)恰恰是其强大之处。约束简化了操作逻辑,使得栈在编译器、操作系统等场景中成为不可替代的工具。

核心操作仅有两个:

  • push(x):将元素x压入栈顶
  • pop():弹出并返回栈顶元素

数学表达式可描述为: S.push(x) → S = [..., x] S.pop() → x, S = [...]

栈的底层实现剖析

数组实现(顺序栈):

class ArrayStack:
    def __init__(self):
        self._data = []

    def push(self, x):
        self._data.append(x)

    def pop(self):
        return self._data.pop()

时间复杂度:push/pop均为O(1),但可能触发动态数组扩容。

链表实现(链式栈):

class LinkedStack:
    class _Node:
        __slots__ = 'val', 'next'
        def __init__(self, val, next=None):
            self.val = val
            self.next = next

    def __init__(self):
        self._top = None

    def push(self, x):
        self._top = self._Node(x, self._top)

    def pop(self):
        res = self._top.val
        self._top = self._top.next
        return res

无需考虑扩容问题,每个操作严格O(1)时间复杂度。

栈的典型应用场景

函数调用栈: 每次函数调用时,系统栈会压入活动记录(包含参数、返回地址等)。递归的本质就是栈的应用,栈深度限制决定了递归深度。

表达式求值: 处理3 + 4 * (2 - 1)这类表达式时:

  1. 操作数栈:[3, 4, 2, 1]
  2. 遇到)时弹出操作符-计算2-1=1
  3. 继续处理*得到4*1=4
  4. 最后处理+得到7

浏览器历史记录: 前进后退功能通过双栈实现:

  • 栈A存储已访问页面
  • 后退时将栈A顶页面压入栈B
  • 前进时从栈B弹回栈A

栈的约束力量体现

括号匹配校验: 遇到左括号压栈,右括号时检查栈顶是否匹配:

def is_valid(s: str) -> bool:
    stack = []
    pairs = {')':'(', '}':'{', ']':'['}
    for ch in s:
        if ch in pairs.values():
            stack.append(ch)
        elif stack and pairs[ch] == stack[-1]:
            stack.pop()
        else:
            return False
    return not stack

单调栈应用: 解决"下一个更大元素"类问题。维护栈内元素单调递减,遇到破坏单调性的元素时触发计算:

def next_greater(nums):
    res = [-1] * len(nums)
    stack = []
    for i in range(len(nums)):
        while stack and nums[stack[-1]] < nums[i]:
            res[stack.pop()] = nums[i]
        stack.append(i)
    return res

栈的扩展变体

最小栈: 在O(1)时间内获取栈中最小值。辅助栈同步记录当前最小值:

class MinStack:
    def __init__(self):
        self.data = []
        self.min_stack = []

    def push(self, x):
        self.data.append(x)
        if not self.min_stack or x <= self.min_stack[-1]:
            self.min_stack.append(x)

    def pop(self):
        x = self.data.pop()
        if x == self.min_stack[-1]:
            self.min_stack.pop()
        return x

    def getMin(self):
        return self.min_stack[-1]

共享栈: 两个栈共享同一数组空间,分别从两端向中间生长。这种设计可有效利用内存空间,适用于内存受限环境。

BbS.okacop071.info/PoSt/1120_705040.HtM
BbS.okacop072.info/PoSt/1120_227080.HtM
BbS.okacop073.info/PoSt/1120_432269.HtM
BbS.okacop074.info/PoSt/1120_115274.HtM
BbS.okacop075.info/PoSt/1120_586780.HtM
BbS.okacop076.info/PoSt/1120_599932.HtM
BbS.okacop077.info/PoSt/1120_299176.HtM
BbS.okacop078.info/PoSt/1120_795666.HtM
BbS.okacop079.info/PoSt/1120_207401.HtM
BbS.okacop080.info/PoSt/1120_144789.HtM
BbS.okacop081.info/PoSt/1120_998567.HtM
BbS.okacop082.info/PoSt/1120_733792.HtM
BbS.okacop083.info/PoSt/1120_979788.HtM
BbS.okacop084.info/PoSt/1120_935503.HtM
BbS.okacop085.info/PoSt/1120_706013.HtM
BbS.okacop086.info/PoSt/1120_863067.HtM
BbS.okacop087.info/PoSt/1120_154515.HtM
BbS.okacop088.info/PoSt/1120_736220.HtM
BbS.okacop090.info/PoSt/1120_674590.HtM
BbS.okacop091.info/PoSt/1120_877984.HtM
BbS.okacop081.info/PoSt/1120_306380.HtM
BbS.okacop082.info/PoSt/1120_824369.HtM
BbS.okacop083.info/PoSt/1120_005353.HtM
BbS.okacop084.info/PoSt/1120_973017.HtM
BbS.okacop085.info/PoSt/1120_422675.HtM
BbS.okacop086.info/PoSt/1120_179899.HtM
BbS.okacop087.info/PoSt/1120_602516.HtM
BbS.okacop088.info/PoSt/1120_161378.HtM
BbS.okacop090.info/PoSt/1120_391914.HtM
BbS.okacop091.info/PoSt/1120_615014.HtM
BbS.okacop081.info/PoSt/1120_108538.HtM
BbS.okacop082.info/PoSt/1120_280484.HtM
BbS.okacop083.info/PoSt/1120_718687.HtM
BbS.okacop084.info/PoSt/1120_810988.HtM
BbS.okacop085.info/PoSt/1120_764244.HtM
BbS.okacop086.info/PoSt/1120_755377.HtM
BbS.okacop087.info/PoSt/1120_550764.HtM
BbS.okacop088.info/PoSt/1120_729163.HtM
BbS.okacop090.info/PoSt/1120_728648.HtM
BbS.okacop091.info/PoSt/1120_773929.HtM
BbS.okacop081.info/PoSt/1120_595928.HtM
BbS.okacop082.info/PoSt/1120_872512.HtM
BbS.okacop083.info/PoSt/1120_626912.HtM
BbS.okacop084.info/PoSt/1120_309972.HtM
BbS.okacop085.info/PoSt/1120_472056.HtM
BbS.okacop086.info/PoSt/1120_089361.HtM
BbS.okacop087.info/PoSt/1120_458509.HtM
BbS.okacop088.info/PoSt/1120_896101.HtM
BbS.okacop090.info/PoSt/1120_303466.HtM
BbS.okacop091.info/PoSt/1120_378007.HtM
BbS.okacop081.info/PoSt/1120_407363.HtM
BbS.okacop082.info/PoSt/1120_687087.HtM
BbS.okacop083.info/PoSt/1120_913213.HtM
BbS.okacop084.info/PoSt/1120_047557.HtM
BbS.okacop085.info/PoSt/1120_249960.HtM
BbS.okacop086.info/PoSt/1120_640742.HtM
BbS.okacop087.info/PoSt/1120_112801.HtM
BbS.okacop088.info/PoSt/1120_819131.HtM
BbS.okacop090.info/PoSt/1120_840877.HtM
BbS.okacop091.info/PoSt/1120_724195.HtM
BbS.okacop081.info/PoSt/1120_510952.HtM
BbS.okacop082.info/PoSt/1120_338210.HtM
BbS.okacop083.info/PoSt/1120_990055.HtM
BbS.okacop084.info/PoSt/1120_189848.HtM
BbS.okacop085.info/PoSt/1120_019378.HtM
BbS.okacop086.info/PoSt/1120_458098.HtM
BbS.okacop087.info/PoSt/1120_099757.HtM
BbS.okacop088.info/PoSt/1120_188515.HtM
BbS.okacop090.info/PoSt/1120_875720.HtM
BbS.okacop091.info/PoSt/1120_583312.HtM
BbS.okacop081.info/PoSt/1120_361233.HtM
BbS.okacop082.info/PoSt/1120_724542.HtM
BbS.okacop083.info/PoSt/1120_512609.HtM
BbS.okacop084.info/PoSt/1120_500269.HtM
BbS.okacop085.info/PoSt/1120_522764.HtM
BbS.okacop086.info/PoSt/1120_474877.HtM
BbS.okacop087.info/PoSt/1120_377518.HtM
BbS.okacop088.info/PoSt/1120_984156.HtM
BbS.okacop090.info/PoSt/1120_884472.HtM
BbS.okacop091.info/PoSt/1120_662994.HtM

#牛客AI配图神器#

全部评论

相关推荐

给🐭🐭个面试机会...:我擦seed✌🏻
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务