堆栈杂谈

 众所周知,堆栈的一个作用就是可以进行计算机来运算。

后缀表达式->中缀表达式

后缀表达式:运算符处于两个操作数之间,如:abc*+de/-

其对应的中缀表达式为:a+b*c-d/e

后缀表达式运算策略为从左向右扫描,逐个处理运算数和运算符号。

1、遇到运算数将其记住

2、遇到运算符号是将离其最近的两个运算数拿出来进行计算

因此问题来了,如何记住还未参与计算的数呢?

需要有种存储方法,能顺序存储运算数,并且在需要时“倒序”输出。堆栈就满足这种性质。

堆栈的抽象数据类型描述

堆栈(stack)是一定操作约束的线性表。只在栈顶(top)进行插入、删除。

插入数据(push):入栈

删除数据(pop):出栈

后入先出:Last in first outLIFO

同样堆栈可以采用顺序存储,也可以采用链式存储。

中缀表达式->后缀表达式

基本策略:1、运算数相对顺序不变。2、运算符号的相对顺序要发生改变。需要等待存储中的运算符号

如:2+9/3-5

对应的后缀表达式为:293/+5-

在过程中遇到运算数将其直接输出,遇到运算符号将其存储起来,与后来的运算符号进行比较。

有括号的情况:

如:a*(b+c)/d

对应为:abc+*d/

左括号将其存入,当遇到右括号时“一股脑”将括号内的符号输出。符号入栈后要与栈顶的符号进行比较,如果栈顶的符号优先级更高的话,将栈顶的符号输出,如果栈顶的优先级低,将符号入栈,等待时机再输出。

总结如下:

从头到尾读取中缀表达式的每个对象

1、运算数:直接输出

2、左括号:压入堆栈

3、右括号:将栈顶的运算符号弹出并输出,直到遇到左括号(出栈不输出)

4、运算符:

          若优先级大于栈顶运算符时,将其亚栈。

          若优先级小于等于栈顶运算符时,将栈顶运算符弹出并输出,再比较新的栈顶运算符,直到该运算符大于栈顶运算符优先级为止,然后将该运算符压栈。

5、若各对象处理完毕,则将堆栈中存留的运算符一并输出。

最后来个例子:

中缀:(2*(9+6/3-5)+4)

后缀: 2963/+5-*4+

链接是相关学习视频

点击打开链接

猜你喜欢

转载自blog.csdn.net/qq_42020563/article/details/80354597