数据结构-栈的使用-后缀表达式的计算和转换

后缀表达式的计算:

遍历后缀表达式:

  • 如果遇到数:将数压入栈中
  • 如果遇到符号:弹出栈中的两个数,作为符号的两个操作数,第一个弹出的数在后,第二个弹出的数在前,进行计算,将得到的结果压入栈中。

最终遍历完后缀表达式之后的栈中所存储的数,便是后缀表达式的计算结果。
例如:
6523+8*+3+*
①6523都被压入栈中,栈顶元素是3。

栈顶3
2
5
6

②遇到+号,弹出2和3,计算2+3=5,将5压入栈中。

栈顶5
5
6

③8压入栈中。

栈顶8
5
5
6

④遇到号,弹出8和5,计算85=40,将40压入栈中。

栈顶40
5
6

⑤遇到+,弹出40和5,计算40+5=45,压入栈中。

栈顶45
6

⑥将3压入栈中。

栈顶3
45
6

⑦遇到+,弹出3和45,计算45+3=48,压入栈中。

栈顶48
6

⑧遇到*,弹出48和6,计算48*6=288,压入栈中。

栈顶288

最终后缀表达式的结果等于288。

标准形式的表达式转换成后缀表达式:

转换过程需要一个存放操作符的栈和一个存放输出内容的表。
转换规则:

  • 遇到数:将数放进输出中。
  • 遇到操作符(括号除外):①若栈为空,则直接将操作符压入栈中。②若栈不为空,则将操作符与栈顶操作符的优先级作比较,直到栈顶元素的优先级小于操作符。如果栈顶元素的优先级高于操作符,则将栈顶操作符弹出并且放入输出中,否则就将操作符压入栈中。
  • 遇到左括号:①如果左括号在栈内,则认为,左括号的优先级最低与除右括号之外的符号相比,目的是为了保证在遇到右括号之前,左括号不被弹出。②如果左括号不在栈内,则认为优先级最高,目的是为了保证左括号不会使得栈内其他符号被弹出。
  • 遇到右括号:弹出栈内操作符,直到对应的左括号被弹出为止,右括号最后不压入栈中,直接丢弃,弹出的左括号不放入输出,直接丢弃

例如
a + b*c+(d * e+f)*g
1、将a、b放入输出,+压入栈中。

栈顶+
输出ab

2、遇到*,*的优先级大于+,所以直接压入栈中。

栈顶*
+
输出ab

3、c放入输出,+优先级小于*,并且等于+,所以*和+弹出放入输入,+压入栈中。

栈顶+
输出abc*+

4、左括号优先级最高,所以直接压入栈中。

栈顶
+
输出abc*+

5、d和e放入输出,*优先级大于左括号直接压入栈中。

栈顶*
+
输出abc*+de

6、+小于乘号,大于(,所以*弹出放入输出,+压入栈内,f放入输出。

栈顶+
+
输出abc*+de*f

7、)优先级最高,大于+,并且遇到了(,所以弹出(和+,将+放入输出。

栈顶+
输出abc*+de*f +

8、*优先级大于+所以直接压入栈中,g放入输出。

栈顶*
+
输出abc*+de*f+g

9、弹出*和+,放入输出

输出abc*+def +g+

最终得到的后缀表达式为:abc*+de*f+g *+

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值