中缀表达式转前缀表达式,中缀表达式转后缀表达式,计算前缀表达式,计算后缀表达式——一篇搞定

了解栈

工欲善其事,必先利其器,想要学会表达式的转化,要先明白我们做转换时使用到的数据结构,栈

栈是一个先进后出的数据结构,一些语言中没有,但是大家可以借助 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

栈通常支持以下基本操作:

  1. Push(入栈):将一个元素添加到栈顶。
  2. Pop(出栈):移除栈顶的元素并返回它。
  3. Top(栈顶):返回栈顶的元素,但不移除它。
  4. IsEmpty(是否为空):检查栈是否为空。
  5. Size(大小):返回栈中元素的数量。

操作符的优先级

*和/的优先级相等,+和-的优先级相等,*和/的优先级大于+和-的优先级

)的优先级最高,高于成簇

(的优先级最低,低于加减

)>*,/>=,->(

中缀转前缀

步骤

创建一个栈

从右向左扫描中缀表达式

  • 遇到操作数,直接把操作数加入表达式中
  • 遇到运算符,依次弹出栈中运算优先级高于当前运算符的所有运算符,并加入表达式
  • 如果碰到栈空了就停止,最后把当前运算符放到操作符栈中
  • 遇到括号时,如果是")"直接入栈,遇到"("就依次把操作符栈中的运算符弹出加入表达式,直至把")"取出。注意:"("和")"不加入表达式
  • 扫描完全部表达式,将剩余运算符弹出,依次加入表达式
  • 最后将表达式反转,得到前缀表达式

举个例子

反转后得到前缀表达式:-+a*bc2

中缀转后缀

有时也称为逆波兰表示法

创建一个栈用于临时存储运算符

从左到右逐个字符读取中缀表达式

  • 当遇到数字或变量时,直接将其添加到后缀表达式中
  • 当遇到运算符(如 +、-、*、/)时,如果栈为空,或者栈顶元素是左括号 '(',则直接将运算符压入栈中。
  • 如果当前运算符的优先级高于栈顶运算符的优先级,则将当前运算符压入栈中。
  • 如果当前运算符的优先级低于栈顶运算符的优先级,从栈中弹出运算符并添加到后缀表达式中,直到栈为空或栈顶运算符的优先级低于当前运算符,然后将当前运算符压入栈中。
  • 当遇到左括号 '(' 时,直接将其压入栈中。
  • 当遇到右括号 ')' 时,持续从栈中弹出运算符并添加到输出列表中,直到遇到左括号 '('。此时应将左括号从栈中移除,但不添加到输出列表中。
  • 扫描完全部表达式,将剩余运算符弹出,依次加入后缀表达式

举个例子

(a+b)*c-2转为后缀表达式就是ab+c*2-

计算前缀表达式

步骤

创建一个空栈

从右到左扫描前缀表达式

  • 如果遇到操作数,直接将其压入栈中
  • 遇到运算符时弹出两个操作数,对弹出的操作数执行运算符指定的操作,先弹出的操作数放在操作符的左边,后弹出的操作数放在操作数的右边,进行计算,将计算的结果压入栈中;
  • 扫描完成,栈中只剩一个元素,即为表达式的结果

举一个例子

前缀表达式+ 3 / * 4 5 2的结果为:13

计算后缀表达式

前缀表达式和后缀表达式的求值步骤相似,区别就是先从栈中取出的元素放在操作数的哪一侧

步骤

创建一个空栈

从左到右扫描前缀表达式

  • 读取到数字就直接入栈
  • 遇到运算符时弹出两个操作数,对弹出的操作数执行运算符指定的操作,先弹出的操作数放在操作符的右边,后弹出的操作数放在操作数的左边,进行计算,将计算的结果压入栈中;
  • 直至读取完毕,栈中剩余的数据的就是结果
  • 最终栈中只有一个数据,若是有多个数据则说明输入的后缀表达式有误。

举个例子

**后缀****表达式:**2 6 2 - * 3 +的值为11

相关推荐
NAGNIP6 小时前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队7 小时前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja12 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下12 小时前
最终的信号类
开发语言·c++·算法
茉莉玫瑰花茶12 小时前
算法 --- 字符串
算法
博笙困了12 小时前
AcWing学习——差分
c++·算法
NAGNIP12 小时前
认识 Unsloth 框架:大模型高效微调的利器
算法
NAGNIP12 小时前
大模型微调框架之LLaMA Factory
算法
echoarts12 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Python技术极客12 小时前
一款超好用的 Python 交互式可视化工具,强烈推荐~
算法