中缀、前缀、后缀表达式

文章介绍了中缀、前缀和后缀表达式的基本概念,包括各自的定义和示例。中缀表达式是我们常见的运算形式,而前缀和后缀表达式常用于计算过程中,以简化处理。转换方法是从中缀转到前缀或后缀,以及从前缀或后缀转回中缀。计算机通常利用后缀或前缀表达式进行高效计算。文章还提及了实际应用,如牛客网的在线编程题中的表达式求值问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、中缀、前缀、后缀表达式简介

表达式中的缀是相对于操作数而言的,即运算符在两个操作数中间称为中缀表达式,运算符在两个操作数前面称为前缀表达式,操作数在两个操作数之后称为后缀表达式。


1.中缀表达式

中缀表达式时我们平常见到的表达式,例如:400 + 20

运算符 +在操作数40020中间


2.前缀表达式

前缀表达式也称为波兰式,例如:+ 400 20

运算符 +在操作数40020前面


3.后缀表达式

后缀表达式也称为逆波兰式,例如: 400 20 +

运算符 +在操作数40020后面


4.举个栗子:

中缀表达式:10 + ( 20 / 4 - 5 ) * 2
前缀表达式(波兰式):+ 10 * - / 20 4 5 2
后缀表达式(逆波兰式):10 20 4 / 5 - 2 * +

二、中缀、前缀、后缀表达式的转换

中–>前、后:
根据定义将操作数置于运算符的前面(或者后面)即可,注意中缀表达式中出现括号时,括号内的表达式运算优先级最高。

前、后–>中:
逆向思维,把运算符前面(或者后面)两个操作数使用该运算符进行连接,即运算符位置放在两个操作数中间。

前–>后 或者 后–>前:
可以先转换成中缀表达式,再进行下一步转换。

三、应用

计算机在进行数值运算时,需要把人类日常使用的中缀表达式转换成后缀表达式或者前缀表达式,方便进行数据存储、获取和运算。

练习:表达式求值
nowcoder[牛客网–在线编程题–表达式求值]

### 前缀中缀后缀表达式的概念 在计算机科学的数据结构领域,前缀中缀以及后缀表达式是表示算术表达式的三种不同方式。每种形式都有其独特的特性和应用场景。 #### 中缀表达式 这是最常见的一种书写方式,在这种表达式里,运算符位于两个操作数之间。例如 `A + B` 是一个简单的二元加法中缀表达式[^1]。 #### 前缀表达式(波兰表示法) 在这种记号下,所有的运算符都放在它们的操作数之前。比如对于上述例子而言,对应的前缀表达式会写作 `+ A B`[^2]。 #### 后缀表达式(逆波兰表示法) 与此相反的是,这里所有运算符都被放置在其对应的操作数之后。同样的例子将以如下形式呈现:`A B +`[^3]。 ### 表达式间的转换方法 为了实现这几种表达式之间的互相转化,可以采用基于堆栈的方法来进行处理: - **从中缀到后缀** 当解析中缀表达式并将其转化为后缀时,遵循特定规则来决定何时将遇到的符号推入或弹出堆栈。具体来说,当遍历输入字符串时: - 如果遇到了数字或其他常量,则立即将其添加至输出队列; - 若遇见左括号则立即压入操作符栈; - 对于右括号的情况,应持续从操作符栈顶部移除元素直到找到匹配的左括号为止,并把所取出的内容依次加入输出序列; - 遇见其他任何类型的运算符时,需依据该运算符相对于当前存在于操作符栈顶端项目的优先级关系采取行动——即要么直接放入栈内等待后续处理,要么先让那些具有较高甚至相等级别的成员先行离开再做安排;最后还需记得清理掉剩余未被使用的部分以便完成整个流程。 - **从前缀中缀** 这个过程涉及到反向扫描给定的前缀串并将各成分逐步重组回标准形态的过程。一般情况下我们会借助辅助性的存储空间如列表或者数组帮助我们管理临时产生的子表达式片段直至最终得到完整的答案格式。 - **从中缀前缀** 类似地,也可以利用双端队列配合单链表等工具按照一定顺序重新排列各项从而达成目标效果。不过值得注意的一点在于实际编码过程中往往更倾向于先由原式变换成RPN版本然后再进一步调整获得所需的结果样式。 ```python def infix_to_postfix(expression): precedence = {'+':1, '-':1, '*':2, '/':2} stack = [] # only ops output = [] for char in expression: if char not in "+-*/()": output.append(char) elif char == '(': stack.append(char) elif char == ')': while stack and stack[-1] != '(': output += stack.pop() stack.pop() # remove '(' from the stack else: while (stack and stack[-1] != '(' and precedence[char] <= precedence.get(stack[-1],0)): output += stack.pop() stack.append(char) while stack: output += stack.pop() return ''.join(output) print(infix_to_postfix("(A+B)*C-(D-E)*(F+G)")) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值