leetcode刷题-题目2:逆波兰表达式计算

来源:互联网 发布:js判断按钮是否被点击 编辑:程序博客网 时间:2024/05/20 15:11

第二道题: 计算逆波兰表达式。算符位:(+,_,*,/)

这道也很简单,首先要理解啥叫逆波兰表达式:

我们知道一般的算数表达式如下:(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])

0 0
原创粉丝点击