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

了解栈

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

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

相关推荐
一念&3 小时前
每日一个C语言知识:C 头文件
c语言·开发语言·算法
Miraitowa_cheems6 小时前
LeetCode算法日记 - Day 88: 环绕字符串中唯一的子字符串
java·数据结构·算法·leetcode·深度优先·动态规划
B站_计算机毕业设计之家7 小时前
python电商商品评论数据分析可视化系统 爬虫 数据采集 Flask框架 NLP情感分析 LDA主题分析 Bayes评论分类(源码) ✅
大数据·hadoop·爬虫·python·算法·数据分析·1024程序员节
小白菜又菜7 小时前
Leetcode 1518. Water Bottles
算法·leetcode·职场和发展
长存祈月心8 小时前
Rust Option 与 Result深度解析
算法
杭州杭州杭州8 小时前
机器学习(3)---线性算法,决策树,神经网络,支持向量机
算法·决策树·机器学习
不语n9 小时前
快速排序(Quick Sort)详解与图解
数据结构·算法·排序算法·快速排序·双指针排序
三萬Q10 小时前
数据结构--并查集
数据结构
桦说编程10 小时前
如何在Java中实现支持随机访问的固定窗口队列
java·数据结构·后端