Leetcode20有效的括号
首先,这道题要判断哪些是不符合题意的,代码只需要覆盖这几种不符合题意的写法就可以,不能拿着就开始写而不去判断
(来自代码随想录)
以上三种情况为不符合题意类型
左括号多余,右括号多余,括号不多于但是类型不匹配
所以我们的代码要包好以上三种情况
代码:
def isValid(self, s: str) -> bool:
stack = []
i = 0
for i in s:
if i=="(":
stack.append(')')
elif i=="[":
stack.append(']')
elif i=="{":
stack.append('}')
elif not stack or stack[-1] != i:
return False
else:
stack.pop()
return len(stack)==0
最后判断stack为空就证明我们已经找完了所有的有效括号啦
Leetcode1047删除字符串中有效字符的所有相邻重复项
链接:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
思路:
这道题比较简单!利用辅助栈的思路,检查栈中如不为空且上一次添加的元素与当下元素是否一样,如果一样 就 pop 如果不一样添加
代码:
def removeDuplicates(self, s: str) -> str:
stack = []
for i in range(len(s)):
if stack and stack[-1]==s[i]:
stack.pop()
else:
stack.append(s[i])
return ''.join(stack)
Leetcode150逆波兰表达式求值
链接:150. 逆波兰表达式求值 - 力扣(LeetCode)
思路:
其实和我们之前做过的删除相邻重复项数字很相似,也是用栈来实现
逆波兰表达式相当于是二叉树中的后续遍历 左右根节点
如果说我们遇见了操作符也就是+-*/这四个,那我们把栈中的元素弹出,然后按照对应的操作符号左计算,计算完之后又重新加入到栈中,也就是相当于递归计算了!
(来自代码随想录)
代码:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for i in range(len(tokens)):
if tokens[i]=="+" or tokens[i]=="-" or tokens[i]=='*' or tokens[i]=='/':
num1 = int(stack.pop())
num2 = int(stack.pop())
if tokens[i] =="+":
stack.append(num2+num1)
elif tokens[i]=="-":
stack.append(num2-num1)
elif tokens[i]=="*":
stack.append(num2*num1)
else:
stack.append(num2/num1)
else:
stack.append(tokens[i])
return int(stack.pop())
总结:对于栈的使用理解又加深了一点!又多了一点做题的思路
对于各种题型 该用什么数据结构 理解+1
继续加油!