栈的概念:https://blog.csdn.net/qq_19446965/article/details/102982047
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses/
遍历表达式:
最后栈中如果为空则返回True,说明所有括号都匹配了
def isValid(self, s):
stack = []
for ch in s:
if ch == "(" or ch == "{" or ch == "[":
stack.append(ch)
else:
if stack:
p = stack.pop()
else:
return False
if ch == ")" and p != "(":
return False
if ch == "}" and p != "{":
return False
if ch == "]" and p != "[":
return False
return not stack
根据逆波兰表示法,求表达式的值。
有效的运算符包括 +
, -
, *
, /
。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
用到栈(先进后出的数据结构)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
遍历表达式:
最后栈中剩余一个数字, 就是结果.
def evalRPN(self, tokens):
result = []
for i in tokens:
if i not in ('+', '-', '*', '/'):
result.append(int(i))
else:
num1 = result.pop()
num2 = result.pop()
if i == '+':
result.append(num2 + num1)
elif i == '-':
result.append(num2 - num1)
elif i == '*':
result.append(num2 * num1)
else:
result.append(int(num2 * 1.0 / num1))
return result[0]
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式可以包含左括号 (
,右括号 )
,加号 +
,减号 -
,非负整数和空格
。
示例 :
输入: "(1+(4+5+2)-3)+(6+8)"
输出: 23
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator/
def calculate(self, s):
res = 0
stack = []
sign = 1 # 符号
num = 0
for c in s:
if c.isdigit():
num = num * 10 + int(c)
elif c == "+":
res += sign * num
num, sign = 0, 1 # 为下一次做准备
elif c == "-":
res += sign * num
num, sign = 0, -1 # 为下一次做准备
elif c == "(":
stack.append(res)
stack.append(sign)
sign = 1
res = 0
elif c == ")":
res += sign * num # 括号内的计算结果
num = 0
res = stack.pop() * res + stack.pop() # 括号外的符号*括号内的结果+括号外的结果
res += sign * num
return res
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator-ii/
def calculate(self, s: str) -> int:
res = 0
stack = [] # 存数
sign = "+" # 存上一个符号
num = 0
for i, c in enumerate(s):
if c.isdigit():
num = num * 10 + int(c)
if c in ('+-*/') or i == len(s)-1:
if sign == "+": # 本nun结尾,上一个符号为+,存储
stack.append(num)
elif sign == "-": # 本num结尾,上一个符号为-,存储
stack.append(-num)
elif sign == "*": # 本num结尾,上一个符号为*, 乘以num,存储
stack.append(stack.pop()*num)
elif sign == "/": # 本num结尾,上一个符号为/, 除以num,存储
stack.append(int(stack.pop()/num)) # 这里注意python2取整方式不通过
#stack.append(int(float(stack.pop())/num)) # python2写法
num = 0
sign = c
return sum(stack) # 对所有加法求和
其余栈的应用:
栈基本概念:https://blog.csdn.net/qq_19446965/article/details/102982047
接雨水:https://blog.csdn.net/qq_19446965/article/details/104144187
矩阵中最大矩形:https://blog.csdn.net/qq_19446965/article/details/82048028
基本计算器类:https://blog.csdn.net/qq_19446965/article/details/104717537
单调栈的应用:https://blog.csdn.net/qq_19446965/article/details/104720836