我是靠谱客的博主 标致草莓,最近开发中收集的这篇文章主要介绍数据结构 | 后缀表达式【深入剖析堆栈原理】❓初见:什么是后缀表达式????磨砺:怎样将中缀表达式转换为后缀表达式【⭐⭐⭐⭐⭐】✒闭隐:如何对后缀表达式进行求值?【⭐⭐⭐】????观镜:结果测试????开战:实战演练【LeetCode习题深入】????归思:总结与提炼,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
Hello,大家好,国庆的第二天,带来的是数据结构中堆栈部分的后缀表达式,这也是一块有关栈的应用方面困扰了众多同学的一个大难题,今天就让我们一起解决这个难题????
堆栈应用之后缀表达式
- ❓初见:什么是后缀表达式
- 后缀表达式的优势
- ????磨砺:怎样将中缀表达式转换为后缀表达式【⭐⭐⭐⭐⭐】
- ????熟悉规则【重点基础掌握】
- ????层层剖析【堆栈原理展示】
- ????手撕代码【不信你看不懂】
- ✒闭隐:如何对后缀表达式进行求值?【⭐⭐⭐】
- ????运算规则
- ????关键代码讲解
- ????观镜:结果测试
- ????测试结果展示
- ????整体代码展示
- ????开战:实战演练【LeetCode习题深入】
- ????题目描述
- ????思路分析
- ????动画展示
- ????整体代码展示
- ????重点讲解
- ????归思:总结与提炼
❓初见:什么是后缀表达式
后缀表达式也称为逆波兰表达式,也就是将算术运算符放在操作数的后面
- 例如【1 + 2 * 3】的后缀表达式形式变为【1 2 3 * +】,前面的那个叫做中缀表达式,也就是我们最常用的,遵循的规则是“先乘除,后加减”;
- 那有些小伙伴就很疑惑,为什么要这么去做呢,好好地用我门正常的计算形式去运算不就好了,下面我们就来讲讲后缀表达式
后缀表达式的优势
- 对于后缀表达式,它十分地有用,因为其可以把复杂的表达式转化为依靠简单操作得到的计算结果的表达式。就我们上面这个表达式来看,是非常简单的,但如果换一个复杂一些的呢,你能够在短期时间内把它计算出来吗????
- 可以看出,对于这个中缀表达式,是比较复杂的,但是我们利用后缀表达式去简化,看起来就没有这么复杂了,利用这个表达式与堆栈的先进后出【FILO】原理,就可以达到事半而功倍的效果
????磨砺:怎样将中缀表达式转换为后缀表达式【⭐⭐⭐⭐⭐】
相信这部分是大家最难过的一道坎,让我们来一探究竟????
????熟悉规则【重点基础掌握】
首先,最重要的一点是你必须知道转换的规则
????法则一:如果遇到一个运算符op以及左括号“(”,此时栈如果为空,则直接将其进栈
????法则二:若是遇到了操作数num,就将其直接输出
????法则三:如果栈不为空,则只有当op的优先级高于栈顶运算符优先级时才将其进栈,否则将栈顶op弹出
????法则四:若当前op进栈时发现栈中有与之相同op,则出栈其一,再加当前op压入栈中
????法则五:若遇到右括号,则开始弹出栈字符,直到左括号为止
????法则六:只要当遇到右括号“)”时,才从栈中弹出左括号“(”,否则一直遍历
- 以上法则是我们要了解后缀表达式转换的基本,你必须将其记牢
????层层剖析【堆栈原理展示】
有了固定的发展,接下来就是具体的案例和分析
- 我们以此表达式为例进行讲解【5 + 8*2 + ( 3 * 9 + 6 )*4】
Part1
- 首先是5,根据法则二,直接放入表达式
- 然后是操作符【+】,根据法则一,栈为空,直接入栈
- 接着是8,同理,直接放入表达式
- 其次是操作符【*】,因优先级高于【+】,故直接入栈
- 最后又碰到一个2,同理,直接放入表达式
Part2
【5 + 8*2 + ( 3 * 9 + 6 )*4】
- 读到【+】,这时要注意,引起优先级低于【*】,所以乘号出栈,放入表达式,但此时遍历到的操作符op与栈中的【+】一致,故栈中的【+】也因放入表达式,接着将遍历到的【+】入栈
Part3
【5 + 8*2 + ( 3 * 9 + 6 )*4】
- 首先读到左括号【(】,这代表一个子表达式的开始,因其优先级最高,故直接入栈
- 然后是3,根据法则二,直接放入表达式
- 接着遇到【*】,此时要注意,根据法则六,因为还没有碰到右括号【)】,说明子表达式还没结束,故直接入栈
- 最后是9,同理,放入表达式
Part4
【5 + 8*2 + ( 3 * 9 + 6 )*4】
- 首先我们遇到【+】,这是看到栈顶op为【*】,比其低,根据法则三,弹出栈顶元素,并将当前op入栈
- 然后是6,根据法则二,直接放入表达式
- 最后读到【)】,表示子表达式结束,开始逐个弹出栈顶元素,直到左括号【(】弹出后结束(括号均不放入表达式)
Part5
【5 + 8*2 + ( 3 * 9 + 6 )*4】
- 碰到【*】,因其优先级高于栈中的【+】,故直接入栈
- 然后是4,根据法则二,直接放入表达式
Part6
【5 + 8*2 + ( 3 * 9 + 6 )*4】
- 最后遍历到末尾,栈中还有两个操作符op,直接弹出即可(不放入表示式)
- 最后的postexp即为转换后的后缀表达式【582*+39*6+4】
????手撕代码【不信你看不懂】
了解了堆栈的基本原理后,接下来就是代码环节,也是可视化计算的重要一趴
void trans(char* exp, char postexp[]) //将算术表达式exp转换成后缀表达式postexp
{
char e;
SqStack* Optr; //定义运算符栈
InitStack(Optr); //初始化运算符栈
int i = 0; //i作为postexp的下标
while (*exp != '