算术表达式求值:“算符优先级法”、“后缀表达式法”

方法1:

该方法来自严蔚敏版数据结构,基本思路是:设置两个工作栈,一个操作数栈,一个操作符栈,在(自左至右)扫描算术表达式时,遇到操作数直接入操作数栈,若遇到操作符,则根据操作符优先级判断下一步操作(“操作符优先级规则”):若其优先级高于栈顶操作符,则入栈,否则(相等或小于),弹出栈顶算符并从操作数栈弹出两个操作数,计算,将计算结果入操作数栈,继续比较与栈顶操作符的优先级,若仍然等于或低于之,则计算,直至大于之,则将此操作符入栈;左括号一定入栈,且其优先级低于后续来到的任何操作符,右括号一定出栈并计算直至遇到左括号,另外栈的开始以“#”开始,算术表达式以“#”结束,做结束标志。当栈空时,计算结束。

方法2:

采用后缀表达式,即“逆波兰式”,因为计算机处理后缀表达式求值问题比较方便,在计算时只需要一个操作数栈,即:将遇到的操作数入栈,凡是遇到操作符便从栈中弹出两个操作数执行计算,并将结果存于栈中,直到后缀表达式的最后一个操作符处理完毕,最后一个入栈的数值即为最终的表达式的值。这里的关键是怎样求得表达式的后缀表达式,其规则与方法1的“操作符优先级规则”基本一致,具体是这样的:转化过程只需要一个操作符栈,自左至右扫描表达式过程中,遇到数字直接入后缀表达式,遇到操作符根据操作符优先级规则出入栈,出栈后直接写入后缀表达式。得到后缀表达式后在计算便简单了。


新来操作符优先级规则
(1)若不高于栈顶符号优先级,则栈顶先出栈,继续比较后续栈顶符号,直至遇到低于自己的符号,则自己入栈;
(2)高于栈顶符号优先级,直接入栈
(3)左括号“(”直接入栈
(4)右括号“)”不入栈,依次弹出栈内操作符,直至遇到“(”
(5)在开始和结束配合使用“#”,终结运算的标志

不好理解的话,可以自己举例按照上述规则操作一遍,就容易记住了。



©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值