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

了解栈

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

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

相关推荐
GoAI3 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi4 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M6 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen7 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
心仪久了会沦陷9 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方9 小时前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
悠仁さん10 小时前
【C++】哈希表
c++·算法·散列表
码少女10 小时前
数据结构——图的基础
数据结构
地平线开发者10 小时前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶