栈之道: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)这类表达式时:
- 操作数栈:[3, 4, 2, 1]
- 遇到
)时弹出操作符-计算2-1=1 - 继续处理
*得到4*1=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
查看11道真题和解析