中缀表达式转后缀表达式及后缀表达式求值
话题1:中缀表达式To后缀表达式
中缀表达式转后缀表达式,首先我们要准备两个字符数组,一个是用来存我们输入的中缀表达式,另一个是用来存我们处理得到的后缀表达式,其次,我们还要准备一个操作符栈,来存储那些还不能确定拼接时机的那些操作符。这里的拼接指的是将操作符拼接到后缀表达式中。
转化的具体原理:
')' > '*' = '/' > '+' = '-' > '('
-
遍历整个中缀表达式数组;
-
如若当前位置字符在'0'~'9'之间或者它是小数点,直接把这个字符插入后缀表达式数组;
-
如果当前字符是空格,则只需将遍历的循环控制变量+1,其他不变;
-
如果当前字符是:
-
'(' : 直接入栈,因为左括号的优先级最低
-
')' : 将操作符栈中的操作符以此弹出并拼接到后缀表达式上,直到遇到与其配对的'('. 注意:这里左右括号不加入后缀表达式!!
-
+、-、*、/:这时我们要比较当前字符表示的操作符和操作符栈栈顶操作符的优先级大小,此处又要分两种情况处理:
-
操作符栈栈顶操作符优先级不小于当前遍历位置操作符的优先级的话,那么直接弹栈,并将弹出的操作符拼接至后缀表达式中,重复这个操作直至栈顶优先级小于当前遍历位置操作符优先级
-
操作符栈栈顶操作符优先级小于当前遍历位置操作符的优先级的话,那么直接将当前位置操作符压入操作符栈中。
-
-
-
出口处理:如果整个中缀表达式遍历完了,操作符栈中还有元素,那么直接将栈中元素依次弹出并拼接至后缀表达式后。
至此,我们将成功将一个中缀表达式转化为一个后缀表达式了......
接下来我们要对后缀表达式按一定的计算方法进行求值
话题2 后缀表达式求值
我们要事先准备一个操作数栈,暂存部分操作数。
后缀表达式求值原理:遍历整个后缀表达式
-
如若当前位置字符是满足>='0'&&<='9',那么交给一个求值函数(下面代码中又详解),并将返回值压入操作数栈中
-
如若当前位置字符是空格,什么都不用动,只需将循环控制变量+1
-
如果当前位置字符是操作符,那么操作数栈弹栈(连续两次),将弹出的两个操作数进行操作符指示相应的计算,并将计算结果压入操作数栈中
-
出口处理,整个后缀表达式遍历结束:此时操作数栈栈顶元素的值即为整个表达式的值,也即我们最初的中缀表达式的值。
接下来是上述两个Topic的代码展示:(能力没到,代码略显冗长^_^望批评斧正!)