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

了解栈

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

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

相关推荐
NAGNIP4 分钟前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo10 分钟前
半开区间和开区间的两个二分模版
算法
moonlifesudo13 分钟前
300:最长递增子序列
算法
CoovallyAIHub5 小时前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
CoovallyAIHub6 小时前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
聚客AI1 天前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v1 天前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工1 天前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农1 天前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了1 天前
AcWing学习——双指针算法
c++·算法