中缀,后缀表达式的转换 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. 继续遍历,遍历结束时栈中只剩下表达式的值。

中缀表达式转后缀表达式

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

你可能感兴趣的:(算法)