表达式求值使用的是“堆栈【先入后出】”的相关知识。
------------------------------
我以你给的这个表达式为例,简单说一下计算流程。
1.读入数字123.321,压入栈。
2.读入操作符+,压入栈。
3.读入数字123,压入栈。
4.读入操作符*,压入栈。
5.读入操作符(,压入栈。
6.读入数字213,压入栈。
7.读入操作符+,压入栈。
8.读入数字3,压入栈。
9.读入操作符/,压入栈。
10.读入数字4,出栈一个操作符/,一个数字3,运算3/4得到0.75,将0.75压入栈。
11.读入操作符),出栈一个数字0.75,一个操作符+,一个数字213,运算213+0.75得到213.75,出栈一个操作符(,将213.75压入栈。
12.表达式已读完,出栈一个数字213.75,出栈操作符*,出栈一个数字123,运算123*213.75得到45528.75,将45528.75压入栈。
13.表达式已读完,出栈一个数字45528.75,出栈操作符+,出栈数字123.321,运算123.321+75528.75得到45652.071,将45652.071压入栈。
14.表达式已读完,出栈一个数字45652.071,堆栈已空,计算结束。输出45652.071.
---------------------------------
遇到}])等右括号时,必须一直从堆栈里弹出数据计算,直到遇到与之匹配的左括号。
遇到乘除乘方等二级运算符夹在两个数字的中间时,应当直接计算,然后将运算结果入栈。
第一次遇到加减等一级运算符,第二次遇到一级运算符时则应当将堆栈里前一次的运算符和数字拿出来做计算,将结果和第二次遇到的一级运算符再入栈。
实现“堆栈”这个容器的时候既可以使用数组,也可以用链表。