欢迎未来的大佬前来观看!!!
概述
栈的应用有很多,最最最最最重要的一个实现就是四则运算。对于四则运算的实现,首先需要了解两个概念:中缀表达式和后缀表达式。
中缀表达式:通用的算术或逻辑公式表示方法。简单的来说就是我们从小到大所学的数学运算表达式都是中缀表达式,也可以称为标准表达式。例如8 + (5 - 2 ) × 3 + 6 ÷ 2
。
后缀表达式:为了更好的解决四则运算发明的一种不带有括号的表达式。
计算机处理四则运算一般有两个步骤:
- 中缀表达式转为后缀表达式
- 后缀表达式进行运算
这两个步骤都是通过栈来实现的。
中缀转后缀
转换规则:从左到右一次遍历中缀表达式,如果是数字则输出,如果是符号,则根据当前符号栈顶符号优先级输出(右括号或栈顶优先级高于当前符号则输出),然后当前符号进栈,直到输出完成。
我们以8 + (5 - 2 ) × 3 + 6 ÷ 2
为例。
1.创建一个空栈。
2.第一个字符是数字8
,直接输出,此时表达式8
。
3.第二个字符是符号+
,进栈,此时表达式8
。
4.第三个字符是符号(
,左括号没有匹配,进栈,此时表达式8
。
5.第四个字符是数字5
,直接输出,此时表达式8 5
。
6.第五个字符是符号-
,进栈,此时表达式8 5
。
7.第六个字符是数字2
,直接输出,此时表达式8 5 2
。
8.第七个字符是符号)
,因为有一个(
与之匹配,出栈,直到遇见(
为止,此时表达式8 5 2 -
。
9.第八个字符是符号×
,因为+
优先级小于×
,所以×
进栈,此时表达式8 5 2 -
。
10.第九个字符是数字3
,直接输出,此时表达式8 5 2 - 3
。
11.第十个字符是符号+
,此时的×
优先级高于+
,全部出栈(注:因为没有比+
优先级更低的符号,即便栈底元素与之平级),然后+
入栈,此时表达式8 5 2 - 3 * +
(这里使用计算机符号*
来替换×
)。
12.第十一个字符是数字6
,直接输出,此时表达式8 5 2 - 3 * + 6
。
13.第十二个字符是符号÷
,此时的÷
优先级高于+
,入栈,此时表达式8 5 2 - 3 * + 6
。
14.第十三个字符是数字2
,直接输出,此时表达式8 5 2 - 3 * + 6 2
。
15.至此遍历完成,栈中剩下的字符依次出栈,此时表达式8 5 2 - 3 * + 6 2 / +
(这里使用计算机符号/
来替换÷
)。
后缀表达式计算
计算规则:从左到右一次遍历后缀表达式,如果是数字则进栈,如果是符号,则出栈两个数字进行计算,计算完成后将结果入栈,直至完成为止。
1.对于求出的后缀表达式8 5 2 - 3 * + 6 2 / +
,前三个字符都是数字,依次进栈。
2.第四个字符是符号-
,2
和5
出栈进行计算(注:此时5是被减数),得到计算结果5-2=3
,入栈。
2.第五个字符是数字3
,入栈,第六个字符是*
,3
和3
出栈进行计算,得到计算结果3*3=9
,入栈。
3.第七个字符是符号+
,9
和8
出栈进行计算,得到计算结果8+9=17
,入栈。紧接着第八第九字符是数字,入栈。
4.第十个字符是符号/
,2
和6
出栈进行计算(此时6是被除数),得到计算结果6/2=3
,入栈。
5.最后剩下字符+
,3
和17
出栈进行运算,得到计算结果17+3=20
,至此计算完成!!!!!
感谢您的阅读!!!