python 实现逆波兰式

复习实习数据结构:

      实现逆波兰式其实搞懂里面的规则就很简单的了。

树的遍历:前序:根左右。中序:左根右。后序:左右根


直接上代码
import operator

opMap = {'+':operator.add,'-':operator.sub,"/":operator.truediv,"*":operator.mul}
proMap = {'(':100,'+':3,'-':3,'*':8,'/':8,')':1,'#':0}

#获取下个操作数
def getNext(leftExpress):
    t = leftExpress[0:1]
    if t.isnumeric():
        for s in leftExpress[1:]:
            if not s.isnumeric():
                break
            else:
                t += s
        return t

    else:
        return t

def popStack():
    while opStack[-1] != '(':
        nStack.append(opStack.pop())
    opStack.pop()

def popStack2(s):
    pro1 = proMap[s]
    for i in range(len(opStack)):
        op = opStack[-1]
        if op == '(':
            opStack.append(s)
            break
        else:
            pro0 = proMap[op]
            if pro0 < pro1:
                opStack.append(s)
                break
            else:
                nStack.append(opStack.pop())

def calculate():
    num = len(nStack)
    i = 0
    while num > 1:
        c = nStack[i]
        if not c.isnumeric():
            x = nStack[i-1]
            y = nStack[i-2]
            res = opMap.get(c)(int(x),int(y))
            nStack[i] = str(res)
            nStack.remove(x)
            nStack.remove(y)
            i = 0
        else:
            i+=1
        num = len(nStack)
    return nStack.pop()


def dealwith(s):
    if s.isnumeric():
        nStack.append(s)
    elif s == '(':
        opStack.append(s)
    elif s == ')':
        popStack()
    elif opStack[-1] == '(':
        opStack.append(s)
    else:
        op = opStack[-1]
        pro0 = proMap[op]
        pro1 = proMap[s]
        if pro1 > pro0:
            opStack.append(s)
        else:
            popStack2(s)

def meger():            
    while len(opStack) > 1:
        nStack.append(opStack.pop())


express = '9+2*3'
opStack = ['#']
nStack = []
def run():
    i = 0
    l = len(express)
    while i < l:
        token = getNext(express[i:])
        dealwith(token)
        i+=len(token)
    meger()
    print(nStack)
    print(calculate())

if __name__ == '__main__':
    run()


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
逆波兰式(Reverse Polish Notation,RPN),也称后缀表达式(Postfix notation),是一种用于数学表达式的表示方法。逆波兰式将运算符放在操作数的后面,而不是放在前面,这样可以避免使用括号。例如,中缀表达式“1 + 2 * 3”可以写成逆波兰式“1 2 3 * +”。 下面是一个简单的逆波兰式生成程序的示例,使用栈来实现计算: ```python def calculate(op, num1, num2): if op == '+': return num1 + num2 elif op == '-': return num1 - num2 elif op == '*': return num1 * num2 elif op == '/': return num1 / num2 def rpn(expression): stack = [] for char in expression: if char.isdigit(): stack.append(int(char)) elif char in ['+', '-', '*', '/']: num2 = stack.pop() num1 = stack.pop() stack.append(calculate(char, num1, num2)) return stack[0] expression = '12+3*' print(rpn(expression)) # 输出:9 ``` 以上程序使用了一个栈来存储数字,并在遇到运算符时执行相应的计算操作。在本例中,逆波兰式字符串为“12+3*”,它的计算过程如下: 1. 遇到字符 '1',将其压入栈中; 2. 遇到字符 '2',将其压入栈中; 3. 遇到字符 '+',弹出栈顶的两个元素(分别为 2 和 1),计算它们的和,得到 3,将其压入栈中; 4. 遇到字符 '3',将其压入栈中; 5. 遇到字符 '*',弹出栈顶的两个元素(分别为 3 和 3),计算它们的积,得到 9,将其压入栈中; 6. 字符串处理完毕,返回栈顶的元素 9。 通过这种方法,我们可以将中缀表达式转换为逆波兰式,并使用逆波兰式来执行计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值