📜  后缀 python 代码的中缀 - Python (1)

📅  最后修改于: 2023-12-03 15:22:58.193000             🧑  作者: Mango

后缀 python 代码的中缀

在Python中,我们通常使用中缀表达式来表示算术表达式。例如,“3 + 4 * 5”是一个中缀表达式。但是,有时我们希望使用后缀表达式来表示算术表达式。例如,“3 4 5 * +”是一个后缀表达式,等同于中缀表达式“3 + 4 * 5”。

在Python中,我们可以将中缀表达式转换为后缀表达式,并使用堆栈来计算后缀表达式的结果。下面是一个简单的Python函数,用于将中缀表达式转换为后缀表达式:

def infix_to_postfix(expression):
    # Operator precedence dictionary
    precedence = {'+': 1, '-': 1, '*': 2, '/': 2}

    # Split the expression into tokens
    tokens = expression.split()

    # Initialize an empty stack and an empty postfix expression
    stack = []
    postfix = []

    for token in tokens:
        if token.isnumeric():
            # If the token is a number, append it to postfix expression
            postfix.append(token)
        elif token in precedence.keys():
            # If the token is an operator, pop operators of higher precedence off the stack and append them to postfix expression
            while stack and stack[-1] != '(' and precedence[token] <= precedence.get(stack[-1], -1):
                postfix.append(stack.pop())
            # Push the current operator onto the stack
            stack.append(token)
        elif token == '(':
            # If the token is a left parenthesis, push it onto the stack
            stack.append(token)
        elif token == ')':
            # If the token is a right parenthesis, pop operators off the stack and append them to postfix expression until left parenthesis is found
            while stack and stack[-1] != '(':
                postfix.append(stack.pop())
            if stack:
                stack.pop()
    # Pop any remaining operators off the stack and append them to the postfix expression
    while stack:
        postfix.append(stack.pop())

    return ' '.join(postfix)

上面函数中的注释对代码进行了解释。主要思路是使用一个运算符优先级字典来决定哪些运算符具有更高的优先级,并使用堆栈来处理中间结果。可以将此功能与一个简单的计算器程序结合使用,如下所示:

def evaluate_postfix(expression):
    # Split the postfix expression into tokens
    tokens = expression.split()

    # Initialize an empty stack
    stack = []

    for token in tokens:
        if token.isnumeric():
            # If the token is a number, convert it to an integer and push it onto the stack
            stack.append(int(token))
        elif token in ['+', '-', '*', '/']:
            # If the token is an operator, pop two numbers off the stack, perform the operation, and push the result onto the stack
            b = stack.pop()
            a = stack.pop()
            if token == '+':
                stack.append(a + b)
            elif token == '-':
                stack.append(a - b)
            elif token == '*':
                stack.append(a * b)
            elif token == '/':
                stack.append(a / b)
    # The final result is the only number left on the stack
    return stack.pop()

上面的注释对代码进行了解释。这个函数将使用堆栈来处理后缀表达式,并执行所需的计算。下面是一个示例用法:

expression = '3 + 4 * 5'
postfix_expression = infix_to_postfix(expression)
result = evaluate_postfix(postfix_expression)
print(result) # Output: 23

在上面的示例中,我们首先将中缀表达式转换为后缀表达式,然后使用后缀表达式计算结果。这个简单的计算器程序可以处理加、减、乘和除四种基本运算,也可以处理带括号的表达式。

这是一个非常基本的示例,但您可以使用此模板构建更复杂的计算器程序。