目录

数据结构(三):栈与队列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 计算器
def cal(s: str) -> int:
	func = {'+':int.__add__,'-':int.__sub__,'*':int.__mul__,'/':lambda x,y:x//y}
	pro = dict(zip('+-*/(','11223'))
	sk,ops = [],[]
	for x,op in re.findall('(\d+)|([-+*/()])',s+'+'):
		if x:
			sk.append(int(x))
		elif op=='(':
			ops.append(op)
		elif op==')':
			while ops[-1] != '(':
				b,a = sk.pop(),sk.pop()
				sk.append(func[ops.pop()](a,b))
			ops.pop()
		else:
			while ops and pro[ops[-1]]<=pro[op]:
				b,a = sk.pop(),sk.pop()
				sk.append(func[ops.pop()](a,b))
			ops.append(op)
	return sk.pop()

例题

  • 0716 最大栈 语法分析
  • 0385 迷你语法分析器
  • 0394 字符串解码
  • 0636 函数的独占时间
  • 0735 行星碰撞
  • 0880 索引处的解码字符串 计算器
  • 0224 基本计算器
  • 0227 基本计算器 II
  • 0726 原子的数量
  • 0770 基本计算器 IV 括号
  • 0020 有效的括号
  • 1021 删除最外层的括号
  • 1249 移除无效的括号
  • 0921 使括号有效的最少添加
  • 1614 括号的最大嵌套深度
  • 0032 最长有效括号
  • 0301 删除无效的括号
  • 0856 括号的分数
  • 1111 有效括号的嵌套深度
  • 1190 反转每对括号间的子串
  • 0678 有效的括号字符串
  • 1541 平衡括号字符串的最少插入次数

单调栈

例题

  • 0496 下一个更大元素 I
  • 0739 每日温度
  • 0901 股票价格跨度
  • 0084 柱状图中最大的矩形
  • 0085 最大矩形
  • 0907 子数组的最小值之和
  • 0456 132 模式
  • 0962 最大宽度坡
  • 1124 表现良好的最长时间段
  • 1130 叶值的最小代价生成树 后面最小的更大数
  • 0975 奇偶跳

单调队列

  • 0239 滑动窗口最大值
  • 0862 和至少为 K 的最短子数组
  • 0918 环形子数组的最大和
  • 1425 带限制的子序列和
  • 1438 绝对差不超过限制的最长连续子数组
  • 1499 满足不等式的最大值
  • 1696 跳跃游戏 VI