使用栈解题:Leetcode 20 有效括号 + Leetcode 150 逆波兰表达式
Leetcode 20 有效括号
题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
题解
很经典的一道利用栈的题目,而且在 python
中,利用 list
数据结构的 append
与 pop
函数就可以轻松的做到实现栈:
思路如下:
- 如果碰到左括号,则直接压入栈中
- 如果碰到右括号,则判断栈顶是否是对应的左括号(比如 “)” 与 “(” )。如果是,则将栈顶;如果不是,则将右括号压入栈中。(注:在这里我是先都压进去,然后判断是否需要将栈顶两个元素同时pop出来,来实现的)
- 所有元素运行完后,如果栈为空,则为有效括号,如果栈非空,则为无效括号。
代码
代码如下:
def isValid(s):
lst = []
for i in s:
lst.append(i)
if len(lst) == 1:
continue
else:
a = lst[-2]
b = lst[-1]
if a == "(":
if b == ")":
lst.pop()
lst.pop()
elif a == "[":
if b == "]":
lst.pop()
lst.pop()
elif a == "{":
if b == "}":
lst.pop()
lst.pop()
if not lst:
return True
else:
return False
执行结果
执行用时:16 ms,
内存消耗:11.8MB
Leetcode 150 逆波兰表达式
题目描述
根据逆波兰表示法,求表达式的值。
有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:
输入: ["2", "1", "+", "3", "*"]
输出: 9
解释: ((2 + 1) * 3) = 9
示例 2:
输入: ["4", "13", "5", "/", "+"]
输出: 6
解释: (4 + (13 / 5)) = 6
题解
使用栈进行解题:遇到数字,则压入栈中;如果遇到的是运算符号,则取出栈顶两个元素,进行求解,再压回栈中,重复这样的操作直至结束就能得到最终的结果。
def evalRPN(tokens):
if len(tokens) == 1:
return int(tokens[0])
Res = "inf"
operation = ["+", "-", "*", "/"]
lst = []
for i in tokens:
if i not in operation:
lst.append(i)
else:
a = int(lst.pop())
b = int(lst.pop())
if i == "+":
Res = a + b
elif i == "-":
Res = b - a
elif i == "*":
Res = a * b
elif i == "/":
Res = int(b / a)
lst.append(Res)
return Res
提交结果
执行时间:72 ms
内存消耗:13.4 MB