利用栈将中缀表达式转为后缀表达式,进行四则运算求值

《数据结构》给出这样一道题目:

借助辅助栈,编写算法,计算一个后缀表示式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 的每一个字符,完成数字入栈、比较运算符的优先级等,还要注意第一个数是负数的特殊情况,注意用户错误输入的情况 。

代码暂略。

 

 

猜你喜欢

转载自blog.csdn.net/weixin_46265255/article/details/108817225