Python中缀表达式转后缀表达式并计算

中缀转后缀

from pythonds.basic.stack import Stack
from string import *


def infixToPostfix(infixexpr):
    # 这里创建一个字典是为了后面 优先级 的比较
    prec = {}
    prec["*"] = 3
    prec["/"] = 3
    prec["+"] = 2
    prec["-"] = 2
    prec["("] = 1

    # 实例化
    opstack = Stack()
    postfixList = []

    # 把输入的字符串分割开
    tokenList = infixexpr.split()

    for token in tokenList:
        # 这里用到的是string模块中的两个方法,源代码都是手敲的字母和数字
        if token in ascii_uppercase or token in digits:
            postfixList.append(token)
        elif token == "(":
            opstack.push(token)
        elif token == ")":
            topstack = opstack.pop()
            while topstack != "(":
                postfixList.append(topstack)
                topstack = opstack.pop()
        else:
            while (not opstack.isEmpty()) and (prec[opstack.peek()] >= prec[token]):
                postfixList.append(opstack.pop())
            opstack.push(token)
    while not opstack.isEmpty():
        postfixList.append(opstack.pop())
    return " ".join(postfixList)


print(infixToPostfix("A + B * C "))
A B C * +

后缀表达式计算(这个程序只能计算个位数后缀表达式)

postfix = infixToPostfix("( 1 + 2 ) * 3")

def postfixEval(postfix):
    opStack = Stack()
    postfixList = postfix.split()
    for v in postfixList:
        if v in "0123456789":
            opStack.push(int(v))
        else:
            right = opStack.pop()
            left = opStack.pop()
            result = domath(left, right, v)
            opStack.push(result)
    return opStack.pop()
def domath(left, right, v):
    if v == "+":
        return left + right
    if v == "-":
        return left -right
    if v == "*":
        return left * right
    if v == "/":
        return left / right
print(postfixEval(postfix))
9
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值