您的位置:首页 > 理论基础 > 数据结构算法

栈的应用-后缀表达式运算求值

2017-01-18 19:40 369 查看
后缀表达式是一种不需要括号的后缀表达法,也称为逆波兰 表示。

百度百科中的简介 :

不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *

后缀表达式实现起来 很适合用 这种数据结构实现,思路如下:

从左到右 遍历每一个数字和符号,遇到数字则进栈,遇到符号,则将栈中数字取出两个进行运算,运算所得结果进栈,重复直至运算结束。

具体做法:

example : 9 3 1 - 3 * + 10 2 / +

初始化一个空栈,用来对数字进出使用。

表达式前三个均为数字, 9 3 1 依次进栈。

接下来为 “-”,将 1 作为 减数, 3 作为被减数,运算 3 - 1 得到 2,将2 进栈。

接下来是数字3进栈。

后按是“”,栈中 3 和 2 出栈,2 3 为6 进栈。

下面是 “ + ”, 6 9 出栈并且运算, 结果15 进栈。

接下来10 和 2 依次进栈。

后面是符号“/”,栈顶的 2 10 依次出栈,10 除以 2 得到5 ,5进栈。

最后一个符号为“+”,所以15与5 相加,得到20,将20 进栈。

20 输出为运算结果。

有个难点就是 考虑如何将 普通的运算转换成后缀表达式,思路如下:

从左到右 按顺序遍历每一个 数字和符号, 若是数字就输出为后缀表达式的一部分,若是符号,则判断它和 栈顶元素 的优先级;若是右括号或优先级不高于栈顶符号则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终后缀表达式输出完为止。

具体做法:(ps:画图更易理解)

example : 9 + (3-1) * 3 +10 / 2

1. 初始化一个空栈,用来对符号进出栈使用。

2. 第一个字符是数字9,输出9,后面是符号“+”,进栈。

3. 第三个字符为“(”,左括号,未配对,进栈。

4. 第四个字符为3,输出, 目前表达式为 9 3 ,接着是 “-”,进栈。

5. 第五个字符为 1, 输出,总表达式为 9 3 1,后面为符号“)”,此时需要去匹配前面的“(”,所以栈顶依次出栈,并输出。总表达式为 9 3 1 -。

6. 第六个字符为 ,因为此时站定符号为“+”,运算级低于 。因此不用出栈,“*”进栈。

7. 第七个字符为数字3,继续输出,目前表达式为 9 3 1 - 3。

8. 第八个字符为“+“,此时栈顶元素为“” 比 “+”优先级要高,依次栈中的所有元素出栈,(ps:没有比 + 优先级更低的运算),目前表达式为 9 3 1 - 3 + 。 然后此时这个+ 进栈。

9. 第九个元素为数字10,输出,总表达式变为 9 3 1 - 3 * + 10 。

10. 第十个元素为符号 “/”,同样优先级高于栈顶元素“+”,所以进栈。

11. 最后一个元素为2,输出, 总表达式变为 9 3 1 - 3 * + 10 2 。

12. 因为已经到了最好,所以将栈中的所有 运算符均出栈。最终的顺序为: 9 3 1 - 3 * + 10 2 / +。

以上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构