基于栈数据结构实现前缀转完全括号中缀表达式的技术问询
栈实现与前缀表达式转完全括号化中缀表达式
嘿,我来帮你搞定这个栈作业和前缀转中缀的问题!先从栈的实现说起,再一步步拆解前缀转中缀的逻辑。
第一步:实现栈函数 make_stack()
栈是典型的后进先出(LIFO)数据结构,我们需要封装它的核心操作:创建空栈、压入元素、弹出元素、判断栈是否为空。用Python实现的话,我们可以把栈的操作封装在一个函数里,返回操作方法的集合:
def make_stack(): stack = [] def push(item): stack.append(item) def pop(): if not is_empty(): return stack.pop() raise IndexError("栈为空,无法弹出元素") def is_empty(): return len(stack) == 0 def peek(): if not is_empty(): return stack[-1] raise IndexError("栈为空,无法查看栈顶") # 返回封装好的栈操作方法 return { 'push': push, 'pop': pop, 'is_empty': is_empty, 'peek': peek }
这个实现用内部列表存储栈元素,对外只暴露必要的操作方法,符合数据结构的封装思想,避免直接操作底层数据导致错误。
第二步:编写 prefix_infix 函数
前缀表达式(波兰表示法)转中缀的核心逻辑是从右到左遍历表达式,结合栈来处理操作数和运算符:
- 遇到操作数,直接压入栈;
- 遇到二元运算符,弹出栈顶的两个操作数(注意顺序:第一个弹出的是右操作数,第二个是左操作数),将它们组合成
(左操作数 运算符 右操作数)的格式,再压回栈; - 遍历结束后,栈中剩下的唯一元素就是完全括号化的中缀表达式。
代码实现如下:
def prefix_infix(prefix_expr): stack = make_stack() # 从右到左遍历前缀表达式的每个元素 for token in reversed(prefix_expr): if token in '+-*/': # 弹出两个操作数,注意顺序 left_operand = stack['pop']() right_operand = stack['pop']() # 组合成带括号的中缀形式 infix_segment = f"({left_operand}{token}{right_operand})" stack['push'](infix_segment) else: # 操作数直接压入栈 stack['push'](token) # 栈中最后剩下的就是最终结果 return stack['pop']()
测试示例
- 输入前缀表达式
['*', '+', 'a', 'b', '-', 'c', 'd'],调用函数会返回((a+b)*(c-d)); - 输入
['/', '*', 'x', 'y', 'z'],会返回((x*y)/z); - 输入简单的
['-', 'm', 'n'],会返回(m-n)。
关键注意点
- 必须从右到左遍历:这是前缀表达式转中缀的核心规则,和后缀表达式(逆波兰表示法)的遍历方向相反;
- 操作数顺序不能搞反:因为栈是后进先出,第一个弹出的是右操作数,第二个是左操作数,组合时要保证运算符在中间、左右操作数位置正确;
- 强制添加括号:每一组运算都用括号包裹,确保完全括号化,彻底避免运算符优先级带来的歧义。
内容的提问来源于stack exchange,提问作者Prashin Jeevaganth
相关产品推荐
相关产品推荐

