众所周知,堆栈的一个作用就是可以进行计算机来运算。
后缀表达式->中缀表达式
后缀表达式:运算符处于两个操作数之间,如:abc*+de/-
其对应的中缀表达式为:a+b*c-d/e
后缀表达式运算策略为从左向右扫描,逐个处理运算数和运算符号。
1、遇到运算数将其记住
2、遇到运算符号是将离其最近的两个运算数拿出来进行计算
因此问题来了,如何记住还未参与计算的数呢?
需要有种存储方法,能顺序存储运算数,并且在需要时“倒序”输出。堆栈就满足这种性质。
堆栈的抽象数据类型描述
堆栈(stack)是一定操作约束的线性表。只在栈顶(top)进行插入、删除。
插入数据(push):入栈
删除数据(pop):出栈
后入先出:Last in first out(LIFO)
同样堆栈可以采用顺序存储,也可以采用链式存储。
中缀表达式->后缀表达式
基本策略: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+
链接是相关学习视频