《数据结构》给出这样一道题目:
借助辅助栈,编写算法,计算一个后缀表示式T的值。
题目减少了将中缀表达式转换为后缀表达式的算法步骤。事实上,要实现四则运算求值,需要把中缀表达式转化为后缀表达式,再把后缀表达式进行运算得出结果。
一、中缀表达式与后缀表达式
1. 观察式子:1+2
平时我们所用的四则运算表达式都是运算符在两个数字中间的,所以称这种表达式为中缀表达式。它需要判断括号匹配,需要判断加减乘除的优先级。
2. 观察式子:1 2 +
运算符在两个数字之后的表达式为后缀表达式。
如果将式子「1」:6 + ( 4 - 2 ) × 3 + 9 ÷ 3
转化为式子「2」:6 4 2 - 3 × + 9 3 ÷ +
12 + 3 ==15
12 3 +==15
和式子「1」比,式子「1」中两个数字中间运算符在式子2中都在两个数字之后出现,称式子「2」为后缀表达式。后缀表达式不需要考虑括号匹配、运算符优先级,简化运算。
二、中缀表达式转后缀表达式
1. 利用栈的特性,给出转换方法
从头到尾读取中缀表达式的每个对象,对不同对象按不同的情况处理。
① 运算数:直接输出;
② 左括号:压入堆栈;
③ 右括号:将栈顶的运算符弹出并输出,直到遇到左括号(出栈,不输出)
④ 运算符:
•当优先级大于栈顶运算符时,则把它压栈;
•当优先级小于或等于栈顶运算符时,将栈顶运算符弹出并输出;再比较新的栈顶运算符,直到该运算符大于栈顶运算符优先级为止,然后将该运算符压栈;
⑤ 若各对象处理完毕,则把堆栈中存留的运算符一并输出。
2. 以中缀表达式:6 + ( 4 - 2 ) × 3 + 9 ÷ 3 转后缀表达式为例
三、后缀表达式的运算
1. 规则:(用栈来进出运算的数字)
① 从左到右遍历中缀表达式的每一个数字和符号
② 若是数字,则进栈
③ 若是符号,则把处于栈顶的两个数字出栈,进行运算
④ 运算结果进栈
⑤ 直到获得最终结果
2. 以计算后缀表达式:6 4 2 - 3 × + 9 3 ÷ + 为例
四、算法的实现
算法需要两个栈,stack1 存放运算数 (num),stack2 存放运算符 (operator) 。分配空间、初始化这两个栈。
接口除了栈的基本操作外,还需要这些操作:判断、比较运算符的优先级、两数四则运算。用户输入的数据为中缀表达式,以%s的格式输入到 str ,循环遍历 str 的每一个字符,完成数字入栈、比较运算符的优先级等,还要注意第一个数是负数的特殊情况,注意用户错误输入的情况 。
代码暂略。