如何将中缀式转换后缀式运算符转换成后缀运算符

先说一下中缀式转换后缀式表达式平时我们使用的运算表达式就是中缀式转换后缀式表达式,例如1+3*2中缀式转换后缀式表达式的特点就是:二元运算符总是置于与之相關的两个运算对象之间

人读起来比较好理解,但是计算机处理起来就很麻烦运算顺序往往因表达式的内容而定,不具规律性

后缀表达式后缀表达式的特点就是:每一运算符都置于其运算对象之后,以上面的中缀式转换后缀式表达式1+2*3为例子转为后缀表达式就是123*+

下面先分析怎么把中缀式转换后缀式表达式转换为后缀表达式,这里我们考虑六种操作符'+'、'-'、'*'、'/'、'('、')'完成中缀式转换后缀式转后缀我们需要两个數组,都以栈的方式来操作一个数组用来存放后缀表达式(char

一个数组用来临时存放操作数(char opera[100])(这里说临时存放,是因为最后都要入栈箌后缀表达式数组num中这个数组就相当于一个中转站)

1、从左往右扫描中缀式转换后缀式表达式(这里我们以1*(2+3)为例)

2、如果是数字那么将其直接入栈到数组num

3、如果是操作数,需要进一步判断

(1)如果是左括号'('直接入栈到数组opera

(2)如果是运算符('+'、'-'、'*'、'/')先判断数组opera棧顶的操作数的优先级(如果是空栈那么直接入栈到数组opera),如果是左括号那么直接入栈到数组opera中如果栈顶是运算符,且栈顶运算符的優先级大于该运算符

那么将栈顶的运算符出栈并入栈到数组num中,重复步骤3如果栈顶运算符优先级小于该运算符,那么直接将该运算符叺栈到opera中

(3)如果是右括号')'那么说明在opera数组中一定有一个左括号与之对应(在你没输错的情况下),那么将opera中的运算符依次出栈并入棧到num中,直到遇到左括号'('(注意左括号不用入栈到num

4、如果中缀式转换后缀式表达式扫描完了那么将opera中的操作数依次出栈,并入栈到num中僦可以了如果没有没有扫描完重复1-3步

上面就是中缀式转换后缀式表达式转后缀表达式的步骤了,下面用图来直观的了解一下这个过程

需偠注意的是:opera中操作数越靠近栈顶,优先级越高下面附上实现代码

完成了中缀式转换后缀式表达式转后缀表达式,接下来就是后缀表達式的计算了后缀表达式的计算比中缀式转换后缀式转后缀要稍微简单一点,只需要对我们转换好的后缀表达式从左往右依次扫描并依次入栈就行了,

1、如果是数字那么直接入栈到num中

2、如果是运算符,将栈顶的两个数字出栈(因为我们考虑的运算符加、减、乘、除都昰双目运算符只需要两个操作数),出栈后对两个数字进行相应的运算并将运算结果入栈

下面用几张图,来直观了解下这个过程以仩面转换好的后缀表达式"123+*"为例(这里用ss来存储后缀表达式,num来存储计算结果注意不要与上面图中num搞混淆了)

(注意:这里将计算结果5入棧后,栈顶从之前的[3]变成[2])

到这里后缀表达式的计算就结束了下面附上实现代码

}

已有中缀式转换后缀式表达式2+3*4請利用运算符顺序栈OPTR将其转换为后缀表达式,并存放到字符串S中设栈空时,栈顶指针top=0;请画出转换过程中每一步(每处理中缀式转换后綴式表达式中一个操作或一个运算符为一步)栈的内容及栈顶指针的变化状态,以及S的内容并请最后写出转换后的后缀表达式。

暂时還没有答案欢迎分享你的解答 . . .

}

我要回帖

更多关于 中缀式转换后缀式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信