一、背景
计算机中有算法求类似"1+2*6+1"这样的表达式的值。
二、主要思路
(一)转成后缀表达式
主要思路:
1、定义结果数组;
2、定义字符栈。
3、遍历表达式:
如果是数字:把数字加入结果数组,连续遍历和加入结果数组,直到当前位置的下一个字符不是数字;最后在数字末尾加末尾符'#'。
如果是运算符:判断栈顶的运算符比自己级别高就出栈,直到栈空或者栈顶的运算符级别比自己小或者同级,然后把自己入栈;如果栈空,直接入栈。
注意:出栈后把运算符加到结果数组的后面。
4、遍历完毕,如果栈不空,就依次出栈所有运算符,加到结果数组后面。
转换结果:
假设表达式为"4+5*6",转成后缀表达式为:"4#5#6#*+"
(二)计算后缀表达式的结果
1、定义整数栈。
2、遍历后缀表达式:
如果是数字:继续一直访问到末尾符‘#’,把这一串数字转成整数,入栈到整数栈中。
如果是运算符:根据运算符,出栈指定个数的数字,进行运算后,把结果入栈到整数栈中。
例如:遍历到'+',代表是加法,需要连续出栈2次,第1次出栈数字a,第2次出栈数字b,计算b + a的值,把结果入栈到整数栈中。
3、遍历完毕,栈顶的元素就是表达式的结果。
三、总结
1、需要设置末尾符才能知道一串数字如何结束(本文末尾符是'#',可以改为其他的)。
2、越优先的运算就需要先执行,也就是先出栈;低级别的运算符需要靠后出栈。
3、需要根据运算符出栈数字个数;加法需要出栈2个数,减法、乘法、除法也需要出栈2个数。