Python栈的应用:中序表达式转前序表达式
中序表达式转前序表达式是将常见的中缀表达式转换成前缀表达式,常用于编译原理中,可以通过栈来实现。
具体实现思路如下:
- 倒序遍历中缀表达式,依次将每个字符压入栈中。
- 遇到操作符时,弹出栈顶两个元素,并在操作符前面加上这两个元素,组成一个新的字符串,将该字符串压入栈中。
- 直到最后,栈顶即为前缀表达式。
下面是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被认为是一个整体,被放置在了操作符之前。在第二个表达式中,括号被正确的转换为了前缀表达式。
相关文章