Day11栈与队列基础part02
20. 有效的括号
先来分析一下 这里有三种不匹配的情况,
- 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
- 第二种情况,括号没有多余,但是 括号的类型没有匹配上。
- 第三种情况,字符串里右方向的括号多余了,所以不匹配。
class Solution:
def isValid(self, s: str) -> bool:
if len(s)%2 !=0: # 如果长度都不是2的对数则一定不对称
return False
stack = []
for i in range(len(s)):
if s[i] == '(': #这里append是相反的,便于识别
stack.append(')')
elif s[i] == '[': # 注意elif和else的区别
stack.append(']')
elif s[i] == '{':
stack.append('}')
elif not stack or s[i] != stack[-1]:
# 这里分析了两种情况:(1)栈为空但仍需要匹配 (2)栈的top元素和要识别的不同
return False
else:
stack.pop()
return True if not stack else False #最后还有一种情况(3)栈都比较完了但又有剩余
1047. 删除字符串中的所有相邻重复项
类似于消消乐
方法一:使用栈
方法二:使用双指针模拟栈,这样可以指向前一个元素
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
for item in s:
if len(stack) == 0 or item != stack[-1]:
stack.append(item)
else:
stack.pop()
return ''.join(stack)
150. 逆波兰表达式求值(理解难)
题意:有效的运算符包括 + , - , * , / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
- 输入: ["2", "1", "+", "3", " * "]
- 输出: 9
- 解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
计算机往往使用后缀表达式,比如(1+2)×(3+4)在后续里有12+34+×,计算方式是遇见数字就加入栈中,遇见运算符就把数字取出进行计算
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for i in tokens:
if i not in {"+", "-", "*", "/"}:
stack.append(i)
else:
num1 = int(stack.pop())
num2 = int(stack.pop())
if i == "+":
num = num1+num2
elif i == "-":
num = num2-num1
elif i == "*":
num = num1*num2
elif i == "/":
if (num1>=0 and num2>0) or (num1<=0 and num2<0) or (num2%num1 == 0):
num = num2//num1
elif num2 ==0:
num = 0
else:
num = num2//num1+1
# print(num)
stack.append(num)
return int(stack.pop())
有用eval的简单写法可以学习