您的位置:首页 > 编程语言 > Lua

【leetcode】:Evaluate Reverse Polish Notation (python)

2014-07-04 17:52 507 查看
逆波兰式的求解,建立一个类栈容器,遍历给定的逆波兰表达式,遇到数字就push, 遇到操作符就进行出栈,连续出两次,因为给定的四则运算符都是双目的,这里注意下这两个操作数的先后顺序,因为对于加法和乘法没关系,但是对于减法和除法是有先后关系的。然后进行相应的运算,将结果push进栈中。

这里附带说明下python中进行除法运算与c,java系列中的除法的不同,就是向下取整的问题。这种不同表现在两个操作数符号不同时的情况。

在c 中 3 / -5 = 0,但是在python中, 结果却为 - 1。这种不同是什么原因呢?或者python为何做这样的调整呢?

我们把这种表达形式抽象一下, a / b = q, 余数为 r 。

a = ( b * q ) + r

但是我们发现在上例中,c 得到的结果会是 ( 0 * (-5) ) + ( - 2 ) = -2 是不等于 -5的,但是在python中, ( -1 * (-5)) + ( -2 ) = 5 - 2 = 3。

也就是python中的处理更符合数学的美感,(姑且这么讲吧)

class Solution:
def isOp(self, s):
return s == "+" or \
s == "-" or \
s == "*" or \
s == "/"

def add( self, op1, op2 ):
return op1 + op2

def sub( self, op1, op2 ):
return op1 - op2

def mul( self, op1, op2 ):
return op1 * op2

def div( self, op1, op2 ):
if op1 * op2 < 0:
return -((-op1) / op2 )
return op1 / op2

#mapping from op to func
operator = { "+": add, "-": sub, "*": mul, "/": div }

def evalRPN( self, tokens ):
nums = []
for s in tokens:
if self.isOp( s ):
op2 = nums.pop()
op1 = nums.pop()
re = self.operator.get( s )(self, op1, op2 )
nums.append( re )
else:
nums.append( int( s ) )
return nums[ 0 ]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: