知识点
- 栈是一种常用的数据结构,它最大的特点是“后入先出”,即后进入栈中的元素最先出来。为了确保“后入先出”的顺序,栈的插入和删除操作都发生在栈顶。
- 很多时候保存在栈中的数据是排序的。根据题目的不同,栈中的数据既可能是递增排序的,也可能是递减排序的。因此,有人将这种用排序的栈解决问题的方法称为单调栈法。
基础练习
1. 后缀表达式
Leetcode.150
解题思路
考虑负数用Isdigit()判断时的特殊处理;考虑只有一个数字的时候要转化成整数的处理
python3实现
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
s =[]
for token in tokens:
if token.lstrip('-').isdigit():
s.append(token)
else:
num1 = int(s.pop())
num2 = int(s.pop())
res = 0
if token == '+':
res = num2 + num1
elif token == '-':
res = num2 - num1
elif token == '*':
res = num2 * num1
print(num1,num2,res)
elif token == '/':
res = num2 / num1
s.append(res)
return int(s.pop(0))
2.直方图最大矩形面积
Leetcode.84
解题思路
- 常规方法:暴力双层循环、分治递归
- 更巧妙的方法是用单调栈
python3实现
3.最小栈
Leetcode.155
解题思路
用变量min_num保存最小值,每次pop和push的时候更新最小值,注意当pop后栈为空时的min_num取值变化。
python3实现
class MinStack:
def __init__(self):
self.stack=[]
self.min_num = sys.maxsize
def push(self, val: int) -> None:
self.stack.append(val)
self.min_num = min(val,self.min_num)
def pop(self) -> None:
pop_num = self.stack.pop()
if pop_num == self.min_num and self.stack:
self.min_num = min(self.stack)
elif len(self.stack) == 0:
self.min_num = sys.maxsize
def top(self) -> int:
if self.stack:
return self.stack[-1]
else:
return 'error'
def getMin(self) -> int:
return self.min_num
4.有效的括号
Leetcode.20
解题思路
考虑边界场景,只有一个符号如何判断是否有效
python3实现
class Solution:
def isValid(self, s: str) -> bool:
stack = []
for i in s:
if i=='(':
stack.append(i)
elif i==')':
if len(stack) > 0 and stack[-1] == '(':
stack.pop()
else:
stack.append(i)
elif i=='[':
stack.append(i)
elif i==']':
if len(stack) > 0 and stack[-1] == '[':
stack.pop()
else:
stack.append(i)
elif i=='{':
stack.append(i)
elif i=='}':
if len(stack) > 0 and stack[-1] == '{':
stack.pop()
else:
stack.append(i)
if len(stack) == 0:
return True
else:
return False