中缀,后缀表达式的转换 python实现

def isOperand(token):
    if token in [str(i) for i in range(0, 10)]:
        return True
    return False


def isOperator(token):
    if token in ['+', '-', '*', '/']:
        return True
    return False


def cal(tokens):
    stack = []
    for token in tokens:
        if isOperand(token):
            stack.append(token)
        elif isOperator(token):
            operand2 = stack.pop()
            operand1 = stack.pop()
            exp = str(operand1) + str(token) + str(operand2)
            result = eval(exp)
            stack.append(result)
    return stack[0]


def trans(tokens):
    priority = {'+': 0, '-': 0, '*': 2, '/': 2, '(': 3}
    result = []
    operators = []
    for token in tokens:
        if isOperand(token):
            result.append(token)
        if token == '(':
            operators.append(token)
        if isOperator(token):
            for operator in operators[::-1]:
                if operator == '(':
                    break
                if priority[token] <= priority[operator]:
                    result.append(operators.pop())
                else:
                    break
            operators.append(token)
        if token == ')':
            for operator in operators[::-1]:
                if operator != '(':
                    result.append(operators.pop())
                else:
                    operators.pop()
                    break
    result.extend(reversed(operators))
    return ' '.join(result)


def main():
    tokens = input("enter: ")
    print(trans(tokens))


if __name__ == '__main__':
    main()

 


计算后缀表达式

cal()函数计算后缀表达式的值。计算一个后缀表达式涉及三个步骤:

1. 从左到右遍历表达式,将运算数加入栈中。

2. 遇到第一个运算符的时候,取出栈中的两个运算数,对它们应用该运算符,将结果放入栈中。

3. 继续遍历,遍历结束时栈中只剩下表达式的值。

中缀表达式转后缀表达式

只要一遇到运算数,就将其加入后缀序列中。遇到运算符时,通常要加入一个栈中。但在加入之前,先将它之前所有具有较高优先级的运算符转移到后缀字符串中。括号特殊处理:读到左括号直接加入栈中,读到右括号持续弹出直到遇到左括号(丢弃左括号)。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值