20.有效的括号(easy)
力扣链接
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
思路
有三种不匹配的情况
1. 左括号多余:([{}]()
2. 右括号多余:([{}])))
3. 没有多余但是类型不匹配:([{}}}
可以创建一个栈,遍历字符串s,当遇到左括号时,push一个对应类型的右括号;当遇到右括号时,判断pop出来的括号是否跟他一样,不一样则返回false。遍历完成后如果栈为空,则返回true。
class Solution:
def isValid(self, s: str) -> bool:
stack = []
quote_dict = {'(':')', '{':'}', '[':']'}
for quote in s:
if quote in quote_dict:
stack.append(quote_dict[quote])
else:
if stack == []: # 判断没有左括号的情况
return False
else:
pop = stack.pop()
if quote != pop:
print(quote, pop)
return False
if stack == []:
return True
else:
return False
1047. 删除字符串中的所有相邻重复项(easy)
力扣链接
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
思路
建立一个栈,对str中的每个char,对比其是否与栈顶元素相同,如果相同则出栈,否则压栈。
class Solution:
def removeDuplicates(self, s: str) -> str:
# 如果当前字符与栈顶相同则pop,否则压栈
stack = []
s = list(s)
for char in s:
if len(stack)!=0 and stack[-1] == char:
stack.pop()
else:
stack.append(char)
res = ''.join(stack)
return res
150. 逆波兰表达式求值(normal)
力扣链接
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
释义
逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。
平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
逆波兰表达式主要有以下两个优点:
去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。
示例 1:
输入: [“2”, “1”, “+”, “3”, " * "]
输出: 9
解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
输入: [“4”, “13”, “5”, “/”, “+”]
输出: 6
解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
思路
其实逆波兰表达式相当于是二叉树中的后序遍历,但暂时没必要用二叉树来解决。
建立一个栈,依次往里面压tokens元素,当遇到运算符时,出栈两个元素进行运算,并把结果再压回去。
注意在处理负数除法时,x//y和int(x/y)的区别
x1 = 6
x2 = -6
y = 4
print(x1//y, int(x1/y))
print(x2//y, int(x2/y))
运行结果:
1 1
-2 -1
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = [] # 用来存数字
operator = ["+", "-", "*", "/"]
for char in tokens:
if char not in operator:
stack.append(char)
else:
t1 = int(stack.pop())
t2 = int(stack.pop())
if char == "+":
res = t1 + t2
elif char == "-":
res = t2 - t1
elif char == "*":
res = t2 * t1
else:
# res = t2 // t1 需要向0取整,遇到负数时这样会出错
res = int(t2/t1)
stack.append(res)
print(stack)
return(int(stack[0]))