一 四则运算表达式求值
采用后缀(逆波兰)表示法
表达式:9+(3-1)x3+10÷2
流程:
1 上面的表达式为中缀表达式,我们需要先转换成后缀表达式,转换过程如下:
![c34a0c4207b9c2a628271054028727ea.png](https://img-blog.csdnimg.cn/img_convert/c34a0c4207b9c2a628271054028727ea.png)
1.1 初始化一个空栈,用来对符号进出栈使用。
![109671ff73f61dc20251e2ea28b3ab4b.png](https://img-blog.csdnimg.cn/img_convert/109671ff73f61dc20251e2ea28b3ab4b.png)
1.2 第一个字符是数字9,输出9,后面符号是“+”,进栈。
![943eafaf94d6ce10e1b02ad4ca9b2f8a.png](https://img-blog.csdnimg.cn/img_convert/943eafaf94d6ce10e1b02ad4ca9b2f8a.png)
1.3 第三个字符是“(”,因其未配对,进栈。
![fef429011152e5ecfe7175c34247704f.png](https://img-blog.csdnimg.cn/img_convert/fef429011152e5ecfe7175c34247704f.png)
1.4 第四个符号是数字3,输出3,总表达式为9 3,接着是“-”,进栈,接着是数字1,总表达式为9 3 1.
![37a0bc89d1b5d5a01dc11d3159d51bc6.png](https://img-blog.csdnimg.cn/img_convert/37a0bc89d1b5d5a01dc11d3159d51bc6.png)
1.5 接下来的字符是“)”,此时我们需要去匹配此前的“(”,所以栈顶依次出栈,并输出,直到“(”出栈。
此时左括号上方只有“-”,因此输出“-”,总的输出表达式为 ” 9 3 1 - “ 如上图。
接着是符号“ x ",因为此时的栈顶符号为“+”号,优先级低于“x”,因此不输出,“x"进栈,接着是数字3,输出。如下图所示:
![39c720d7e446c62a4cebb35b2eb429f1.png](https://img-blog.csdnimg.cn/img_convert/39c720d7e446c62a4cebb35b2eb429f1.png)
图 1.6
接下来是符号”+“,此时当前栈顶元素”x" 比这个 “+”优先级高,因此栈中元素出栈并输出(没有比“+”号更低的优先级,所以全部出栈),总输出表达式为 “9 3 1 - 3 * +”。然后将当前这个符号“+”进栈。如下图所示:
![3a568b0677116eee9e5a9f76861b8e82.png](https://img-blog.csdnimg.cn/img_convert/3a568b0677116eee9e5a9f76861b8e82.png)
图1.7
接下来是是数字10,输出,总表达式为”9 3 1 - 3 * + 10“。后是符号”÷“,进栈。如下图所示:
![a8a06fc5350abf808de1a3caa8ef21ef.png](https://img-blog.csdnimg.cn/img_convert/a8a06fc5350abf808de1a3caa8ef21ef.png)
图1.8
最后一个数字2,输出,总表达式为 ”9 3 1 - 3 * + 10 2“
因已经到最后,所以将栈中符号全部出栈并输出。最终输出的后缀表达式结果为” 9 3 1 - 3 * + 10 2 ÷ + “
2 后缀表达式计算结果
后缀表达式:9 3 1 - 3 * + 10 2 ÷ +
规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。
2.1 初始化一个空栈
2.2 后缀表达式中前三个都是数字,所以 9 3 1 进栈,如图2.1
![9f158a9ba502e06e64fb3a065d829ab1.png](https://img-blog.csdnimg.cn/img_convert/9f158a9ba502e06e64fb3a065d829ab1.png)
图2.1
2.3 接下来是”-“,将栈中1出栈作为减数,3出栈作为被减数,并运算3-1得到2,再将2进栈,如图2.2
![8f5be4ba3055ad61d0f92b7b4e2bc266.png](https://img-blog.csdnimg.cn/img_convert/8f5be4ba3055ad61d0f92b7b4e2bc266.png)
图2.2
2.4 接着是数字3,进栈,如图2.3所示
![983baaf4eface079356fde35303dfb37.png](https://img-blog.csdnimg.cn/img_convert/983baaf4eface079356fde35303dfb37.png)
图2.3
2.5 接着是符号”*“,出栈3 和 2, 并运算2*3得6,入栈6,如图2.4所示
![bcc6f1c32a5399d048eb4932cf813772.png](https://img-blog.csdnimg.cn/img_convert/bcc6f1c32a5399d048eb4932cf813772.png)
图2.4
2.6 接着是符号”+“,出栈6和9,运算6+19得15,入栈15,如图2.5所示
![bf731a5c15201f634a346c7898ab2340.png](https://img-blog.csdnimg.cn/img_convert/bf731a5c15201f634a346c7898ab2340.png)
图2.5
2.7 接着是数字 10 和 2,入栈 10 和 2,如图 2.6所示
![e29a7366e22d34f91122faaf6369a5bb.png](https://img-blog.csdnimg.cn/img_convert/e29a7366e22d34f91122faaf6369a5bb.png)
图2.6
2.8 接着是符号”÷“,出栈2作为除数,出栈10作为被除数,运算10÷2得5,入栈5,如图2.7所示
![43ca161f7444c9b91175c703ef438e8b.png](https://img-blog.csdnimg.cn/img_convert/43ca161f7444c9b91175c703ef438e8b.png)
图2.7
2.9 最后是符号”+“,出栈5和15,运算5+15得20,入栈20.如图2.8所示
![9572927950027a86bd5af4f3d68355a9.png](https://img-blog.csdnimg.cn/img_convert/9572927950027a86bd5af4f3d68355a9.png)
图2.8
2.10 结果是20出栈,栈变为空。