从头到尾读取中缀表达式的每个对象,对不同对象按不同的情况处理。
1.运算数:直接输出:
2.左括号:压入堆栈:
3.右括号:将栈顶的运算符弹出并输出,直到遇到左括号(出栈,不输出):
4.运算符:
. 若优先级大于栈顶运算符时,则把它压栈:
. 若优先级小于等于栈顶运算符时,将栈顶运算符弹出并输出:再比较新的栈顶运算符,直到该运算符大于栈顶运算符优先级为止,然后将该运算符压栈。
.优先级相同按小于算,从左到右,左边的优先级高,
5.若各对象处理完毕,则把堆栈中存留的运算符一并输出。
例:
a*(b+c)/d =?
通过上面的操作
1.碰到a,a是运算数,输出 a
2.碰到运算符*,因为栈顶为空相当于优先级大于栈顶运算符,压栈,栈里面现在有个* ,左边是栈底,右边是栈顶
3.碰到左括号,压栈,左括号优先级最小,压栈,栈里面是*(
4.碰到b,b是运算数,输出b,现在已经输出了ab
5.碰到运算符+,优先级大于左括号,压栈,栈里面是*(+
6,碰到c,输出abc
7.碰到右括号,弹出所有运算符,直到弹出左括号后停止弹出,左括号不输出,输出abc+ ,栈里面是*
8.碰到运算符/,栈里面只有*,比较优先级,优先级相同,因为遵循从左到右,所以*的优先级高,弹出*,压栈/,输出abc+*,栈里面是/
9.碰到d,输出abc+*d,栈里是/
10.碰到=,优先级低于/,弹出/ ,输出abc+*d/
所以最终结果是abc+*d/
后缀表达式的计算步骤:
abc+*d/ 先计算b+c,得出结果e,
表达式就变成 ae*d/ ,计算a*e ,得出结果f,
变成fd/,然后计算 f/d 求出最终结果