算法训练营第十一天 |栈与队列02
150.逆波兰表达式求值
学习文档:逆波兰定义
思路1 从栈中进行求值
因为返回的是一个逆波兰表达式tokens = ["2","1","+","3","*"]
,遍历该列表然后从中取元素,如果是数字则入栈,如果是符号取栈顶的两个元素做表达式,并将该结果重新压入栈。
class SqStack:
def __init__(self):
self.data=[]
#判断栈是否为空
def empty(self):
if len(self.data)==0:
return True
return False
#进栈
def push(self,e):
self.data.append(e)
#出栈
def pop(self):
assert not self.empty()
return self.data.pop()
#取栈顶元素
def gettop(self):
assert not self.empty()
return self.data[-1]
class Solution(object):
def evalRPN(self, tokens):
"""
:type tokens: List[str]
:rtype: int
"""
data_stack = SqStack()
for num in tokens :#遍历列表,并判断是否为运算符
if num.isdigit() or (num[0]=='-'and len(num)!=1) :
data_stack.push(num)
else:
num1 = str(data_stack.pop())
num2 = str(data_stack.pop())
result = int(eval(num2+num+num1))
data_stack.push(str(result))
return int(data_stack.pop())
- 定义数据结构
SqStack
栈,遍历栈以后并判断是否为数字。
str.isdigit()
只可以判断是否为正数或者0,不可以判断负数- 使用
-
来判断,并使用len(str)
来判断是否为运算符。
将数字压入栈中,如果遇到运算符就取出栈顶的两个元素来做运算。并将运算结果压入栈中。
依据以上一直重复。
但是依据
eval
计算出来的0.几会向上取整,
return int(x / y) if x * y > 0 else -(abs(x) // abs(y))
重新定义函数
思路2 卡哥讲解 导入 operator库
from operator import add, sub, mul
def div(x, y):
# 使用整数除法的向零取整方式
return int(x / y) if x * y > 0 else -(abs(x) // abs(y))
class Solution(object):
op_map = {'+': add, '-': sub, '*': mul, '/': div}
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for token in tokens:
if token not in {'+', '-', '*', '/'}:
stack.append(int(token))
else:
op2 = stack.pop()
op1 = stack.pop()
stack.append(self.op_map[token](op1, op2)) # 第一个出来的在运算符后面
return stack.pop()