本来用栈实现表达式求值,这次用二叉树来实现,DRY`
一开始做的时候,脑子里没有一点概念,而没概念是最要命的,所以在网上乱晃,希望有个解释,但可能实在太浮躁了,代码是不想看的,而思路自己也看不大懂,所以本来想TJ, 最终忍住了,直接买了本数据结构(C语言版),慢慢看,它上面的思路很连续,看了之后终于懂了。
为了连续性,我先把后缀表达式的栈实现描述一下,因为栈实现对于计算过程的理解还是挺便利的。
我们平时计算的表达式是中缀表达式,(1+2)*3 => exp1
而后缀表达式是计算机非常喜欢的一种格式,将上面的expr1转换成后缀形式1 2 3 * + => exp2
利用栈的先进后出原理, 将exp2的字符顺序压入栈,对于数字和操作符分别对待
如果exp2读取结束,退出
如果是数字,那就压入栈中
如果是操作符,弹出栈中适量数字,进行计算,再将计算结果压入栈
以exp2为例,
step 1:
读取exp2 位置0字符‘1’, 压入栈中
栈底 1
step 2:
读取exp2 位置1字符‘2’, 压入栈中
栈底 1 2
step 3:
读取expr3 位置2字符‘3’, 压入栈中
栈底 1 2 3
step 4:
读取exp2 位置3字符 '*', 由于是运算符,并且它是二元运算符,所以弹出两个参数,即栈中的 2和3, 将它们相乘,把得到的值6压回栈中, 此时栈中由于弹出2次,压回一次,只剩下两个元素
栈底 1 6
step 5:
读取exp2 位置4字符 ’+', 由于是运算符,并且是二元运算符, 弹出两个参数, 即栈中的 1和6, 将结果7压回栈中, 此时栈中只剩下7一个元素
栈底 7
step 6: