表达式举例
中缀表达式 A+(B-C/D)*E
后缀表达式 ABCD/-E*+
中缀表达式与后缀表达式的区别:
- 运算数的顺序都是相同的
- 运算符的书写顺序不同,但真正的逻辑计算顺序相同
将中缀表达式
运算符的优先级
- 乘法(或除法)、取模运算 最高
- 加法(减法) 次高
- 左括号 最低
栈的应用
将中缀表达式转换为后缀表达式的过程需要用到栈,因为当从左到右扫描时不能确定当前运算符的优先级别(没有扫到最右边,还不能预知)
在后缀表达式中,优先级高的以及括号内的运算符出现在前面
中缀表达式转后缀表达式的步骤
(1) 从左到右扫描,遇到数字,判断是否大于0小于9,若是添加到后缀表达式,继续取字符
(2) 遇到乘号(或除号),判断若栈不为空且栈顶取出来的是乘号(或除号),则将栈顶的运算符出栈,若不满足则不将栈顶的运算符出栈。然后当前运算符入栈。
(3) 遇到左括号,直接入栈。
(4) 遇到加号(或减号),判断若栈不为空且栈顶取出来的不是左括号,则出栈运算符,若不满足则不将栈顶的运算符出栈。然后当前运算符入栈。
(5) 遇到右括号,出栈。然后将左括号之前的全部追加到后缀表达式中。
计算后缀表达式的值
(1) 若遇到数字,入栈。
(2) 若遇到运算符,取出栈顶的2个元素
中缀表达式转前缀表达式的步骤
(1) 初始化2个栈:运算符栈S1和存储中间结果的栈S2
(2) 从右到左扫描中缀表达式
(3) 遇到操作数,将其放入S2
(4) 遇到运算符,比较其与S1栈顶运算符的优先级
(4-1)若S1为空,或栈顶运算符为右括号,则直接将此运算符入栈
(4-2)否则,若优先级比栈顶运算符高或相等,也将次运算符入栈
(4-2)否则,将S1栈顶的运算符弹出并压入S2中,然后跳转到(4-1)与S1中新的栈顶运算符进行优先级的比较
(5) 遇到括号时
(5-1)若是右括号,则直接入栈S1
(5-2)若是左括号,依次弹出S1的栈顶运算符并压入S2中,直到遇到右括号为止,此时将这一对括号丢弃
(6) 重复步骤(2)—(5)直到表达式的最左边
(7) 将S1中剩余的运算符依次弹出并压入S2
(8) 依次弹出S2中的元素并输出,此即为中缀表达式对应的前缀表达式
前缀表达式的计算
与后缀表达式类似,从右到左扫描,若遇到运算符,则弹出2个元素进行运算
仅供学习