Python处理逆波兰表达式

中文名: 逆波兰表达式 

外文名: Reverse Polish Notation 
别名: 后缀表达式
逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。这个知识点在数据结构和编译原理这两门课程中都有介绍。它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下:
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。


在Python2中的处理方法:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

RPN_str = '1 2 + 3 4 - *'

stack = []

for c in RPN_str.split():

    if c in '+-*':
        i2 = stack.pop()
        i1 = stack.pop()
        print i1,c,i2
        print eval('%s'*3 % (i1,c,i2))
        stack.append(eval('%s'*3 % (i1,c,i2)))
    else:
        stack.append(c)

print 'result', stack[0]


当然还有更Hacker一些的写法:

print reduce(lambda stack, c: stack+[eval('{2}{1}{0}'.format(stack.pop(),c,stack.pop()))] if c in '+-*' else stack+[c], RPN_str.split(),[])[0]
 
 

你可能感兴趣的:(python)