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

了解栈

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

栈是一个先进后出的数据结构,一些语言中没有,但是大家可以借助 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

相关推荐
203号居民1 小时前
LeetCode hot 100 — 25. K 个一组翻转链表
算法·leetcode·链表
ocean21032 小时前
2025-2026年AI算法与模型研发面试高频知识点洞察
人工智能·算法·面试
Nil2082 小时前
leetcode 78子集
数据结构·算法·leetcode
喜欢吃燃面3 小时前
深入 C++ STL:从 unordered_set与unordered_map到底层哈希表的原理与实现
数据结构·c++·散列表
en.en..3 小时前
Linux fork() 工作原理
数据结构·算法
地平线开发者4 小时前
bevformer算法模型详细解读
算法
liliangcsdn4 小时前
ICIR权重矩阵如何加权标准化为综合因子
算法
SDWAN_Cheap5 小时前
SD-WAN智能选路技术的算法与实现机制
算法·php·sdwan
不会就选b5 小时前
数据结构之树&&二叉树(二)
数据结构·算法
渡之6 小时前
ArduPilot (APM)滤波器之SlewLimiter 深度解析
算法