中缀与后缀表达式

前言

什么是中缀、后缀表达式?还有个前缀表达式。自行百度。这里主要说一说中缀怎么转后缀表达式,以及怎样根据后缀表达式求值。

中缀转后缀

方法有二。

其一:规则法

1、中缀表达式从左到右依次扫描,遇到操作数,直接输出;
2、遇到操作符需要判断(另:正负号应算入操作数):
2.1、'('左括号:直接入栈;
2.2、')'右括号:依次把栈中的运算符输出,直到出现左括号。将左括号从栈中删除,右括号则丢弃。
2.3、如果是其他运算符:判断当前扫描到的运算符和栈顶元素的优先级('*、/'为 2,'+、-'为1,'('为0,其他为-1)。如果当前运算符优先级较高,则直接入栈,否则,依次输出比当前运算符优先级高或相等的运算符,直到遇到不符合条件的元素或者遇到左括号为止,再将当前运算符入栈。
3、扫描结束后,如果运算符存放栈还有元素,则依次输出。

举例:1*3+((2+4)/3+6)

1输出 结果:1 运算符存放栈:
*入栈 结果:1 运算符存放栈:*
3输出 结果:1 3 运算符存放栈:*
*出栈,+入栈 结果:1 3 * 运算符存放栈:+
(入栈 结果:1 3 * 运算符存放栈:+(
(入栈 结果:1 3 * 运算符存放栈:+((
2输出 结果:1 3 * 2 运算符存放栈:+((
+入栈 结果:1 3 * 2 运算符存放栈:+((+
4输出 结果:1 3 * 2 4 运算符存放栈:+((+
+出栈,(删除,)丢弃 结果:1 3 * 2 4 + 运算符存放栈:+(
/入栈 结果:1 3 * 2 4 + 运算符存放栈:+(/
3输出 结果:1 3 * 2 4 + 3 运算符存放栈:+(/
/出栈,+入栈 结果:1 3 * 2 4 + 3 / 运算符存放栈:+(+
6输出 结果:1 3 * 2 4 + 3 / 6 运算符存放栈:+(+
+出栈,(删除,)丢弃 结果:1 3 * 2 4 + 3 / 6 + 运算符存放栈:+
+出栈 结果:1 3 * 2 4 + 3 / 6 + + 运算符存放栈:

其二:括号法

1、先按照运算符的优先级对中缀表达式加括号,得 (1*3)+((((2+4)/3)+6)) ;
2、将运算符移到括号的后面,得 (13)*((((24)+3)/6)+)+ ;
3、去掉括号,得 13*24+3/6++ 。

后缀表达式求值

1、遍历后缀表达式,遇到操作数就入栈;
2、遇到操作符,就pop两个栈中元素,进行计算,结果再压入栈中。直至得出最终结果。

思想有了,代码就有了~~
详见中缀与后缀表达式–代码篇

发布了32 篇原创文章 · 获赞 4 · 访问量 3405

猜你喜欢

转载自blog.csdn.net/qq_35241071/article/details/103183995