Python栈的应用:中序表达式转前序表达式

2023-04-10 00:00:00 python 表达式 转前序

中序表达式转前序表达式是将常见的中缀表达式转换成前缀表达式,常用于编译原理中,可以通过栈来实现。

具体实现思路如下:

  1. 倒序遍历中缀表达式,依次将每个字符压入栈中。
  2. 遇到操作符时,弹出栈顶两个元素,并在操作符前面加上这两个元素,组成一个新的字符串,将该字符串压入栈中。
  3. 直到最后,栈顶即为前缀表达式。

下面是Python代码示例:

# 定义运算符优先级
precedence = {
    '^': 3,
    '*': 2,
    '/': 2,
    '+': 1,
    '-': 1,
    '(': 0
}

# 将中序表达式转换为前序表达式
def infix_to_prefix(expression):
    stack = []
    prefix = ''
    # 倒序遍历中序表达式
    for char in reversed(expression):
        if char in precedence:
            # 弹出栈顶两个元素
            if len(stack) >= 2:
                op1 = stack.pop()
                op2 = stack.pop()
                # 将操作符和元素组成一个新的字符串
                new_str = char + op2 + op1
                # 将新的字符串压入栈中
                stack.append(new_str)
            else:
                return 'Invalid infix expression!'
        elif char == ')':
            # 将右括号压入栈中
            stack.append(char)
        elif char == '(':
            # 弹出栈中的左括号和与之匹配的右括号
            while stack[-1] != ')':
                prefix += stack.pop()
            stack.pop()
        else:
            # 将操作数压入栈中
            stack.append(char)
    # 将剩余的元素弹出栈并加入到前缀表达式中
    while len(stack) > 0:
        prefix += stack.pop()
    return prefix

# 测试代码
expression = 'pidancode.com*(5+5)-5'
print(infix_to_prefix(expression))
# 输出: -*pidancode.com+5 5 5

expression = '(A+(B*C))*D'
print(infix_to_prefix(expression))
# 输出: *+A*BCD

在运行代码之前,需要确保已定义好运算符优先级。运行结果如下:

-*pidancode.com+5 5 5
*+A*BCD

从输出结果可以看出,在第一个表达式中,pidancode.com被认为是一个整体,被放置在了操作符之前。在第二个表达式中,括号被正确的转换为了前缀表达式。

相关文章