第二道题: 计算逆波兰表达式。算符位:(+,_,*,/)
这道也很简单,首先要理解啥叫逆波兰表达式:
我们知道一般的算数表达式如下:(1+2)*3 -4。我们暂且称之为中序表达式,就是运算符在操作数中间。
所谓逆波兰就是以及运算符紧邻在操作数之后。例如上面的表达式逆波兰式位:12+3*4-。逆波兰式的特性是
不用考虑运算符的优先级,适合计算机运算。
计算逆波兰式的算法可以表示为:
初始化操作数栈。
扫描输入 tokens:
如果当前token为运算符,从操作数栈取出两个操作数,进行运算,结果入栈。
如果当前token位操作数,入栈
结果操作数栈应该仅剩一个值,即为所求。
注意这里没有考虑输入有误的情况。
代码如下:
class Solution:
# @param tokens, a list of string
# @return an integer
def evalRPN(self, tokens):
op_d={}
op_d['+']=lambda x,y:x+y
op_d['-']=lambda x,y:x-y
op_d['*']=lambda x,y:x*y
op_d['/']=lambda x,y:float(x)/float(y)
def find_op(str_):
try:
op=op_d[str_]
except KeyError:
raise ValueError("invalid operator: "+str_)
return op
ll_optor=[]
ll_opand=[]
operator = set(['+','-','*','/'])
for token in tokens:
if token in operator:
r_optor = ll_optor.pop()
l_optor = ll_optor.pop()
op=find_op(token)
result = apply(op,[int(l_optor),int(r_optor)])
ll_optor.append(result)
else :
ll_optor.append(token)
return int(ll_optor[0])