【代码随想录训练营】【Day 11】【栈与队列-2】| Leetcode 20, 1047, 150
需强化知识点
- 逆波兰表达式(后缀表达式)的知识点
- stack的灵魂:栈帮助我们记录了遍历数组当前元素时候,前一个元素是什么。
题目
20. 有效的括号
class Solution:
def isValid(self, s: str) -> bool:
s_stack = []
s_dict = {'(':')', '[':']', '{':'}'}
for c in s:
if c in ['(', '[', '{']:
s_stack.append(c)
else:
if len(s_stack) == 0:
return False
left = s_stack.pop()
if s_dict[left] != c:
return False
if s_stack:
return False
else:
return True
1047. 删除字符串中的所有相邻重复项
- stack的灵魂:栈帮助我们记录了遍历数组当前元素时候,前一个元素是什么。
- 也可以用双指针来实现,注意每次是会覆盖 res[slow] = res[fast]的,fast代表当前遍历到的位置,slow为当前维护的后一个位置
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
for i in range(len(s)):
if stack and s[i] == stack[-1]:
stack.pop()
else:
stack.append(s[i])
return ''.join(stack)
# 方法二,使用双指针模拟栈,如果不让用栈可以作为备选方法。
class Solution:
def removeDuplicates(self, s: str) -> str:
res = list(s)
slow = fast = 0
length = len(res)
while fast < length:
# 如果一样直接换,不一样会把后面的填在slow的位置
res[slow] = res[fast]
# 如果发现和前一个一样,就退一格指针
if slow > 0 and res[slow] == res[slow - 1]:
slow -= 1
else:
slow += 1
fast += 1
return ''.join(res[0: slow])
150. 逆波兰表达式求值
- 逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
- 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
- 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
- 逆波兰表达式主要有以下两个优点:
- 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
- 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中
- Python语法: 此处要求除法向0处截断,需要使用int来进行(也是向0处截断);// 是向下取整,对于结果为正数,向下取整,对于负数,则取向更小的最接近的负数
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for c in tokens:
# if c.isdigit():
if c not in ['+', '-', '*', '/']:
stack.append(int(c))
else:
num2 = stack.pop()
num1 = stack.pop()
if c == '+':
new_num = num1 + num2
elif c == '-':
new_num = num1 - num2
elif c == '/':
# new_num = num1 // num2
new_num = int(num1 / num2)
else:
new_num = num1 * num2
stack.append(new_num)
return stack.pop()