中缀表达式和后缀表达式

前两天想做计算器来着,就把这个再拿出来看一看。

中缀表达式转化后缀表达式

准备一个计算符工作栈。扫描表达式的时候,遇到数字直接输出,遇到符号就往栈里面存。

1) 如果要存的符号比栈顶的符号优先级高,就直接存入。如果不比栈顶符号优先级高,就把栈顶符号输出出来。比如,要存一个 / 号,而栈顶也是一个 / 号,二者相等,不比栈顶优先级高,就把栈顶的 / 号输出出来。

2) 如果栈顶是个 ( ,则直接把要存的符号存进去。

3) 如果要存的是个 ) ,那么输出栈中的符号,直到遇到一个 ( , 并把这个 ( 也输出出去。

 

比如将 a+b*c+(d*e+f)*g ,转化后就是 abc*+de*f+g*+ 。

手工转换

手工就是按照优先级将 a op b 写成 (ab)op 的形式,上面的式子可以写成 ((a(bc)*)+(((de)*f)+g)*)+ ,然后去掉所有的括号,就是 abc*+de*f+g*+ ,手工操作还可以很方便地转化成前缀表达式。

后缀表达式输出

准备一个操纵数工作栈,遇到操作数就往里面存。遇到操作符就提取出栈顶与次栈顶元素,

op 
b
a

 a op b 计算出结果,当作新的栈顶再存进去。

但是暂时还不清楚如何处理表达式里面的小数和负数问题。。等以后学会 Qt 之后,再一并解决这些问题吧。收藏夹里保存的那个,用到了类模板,等学到了之后再去看看他的操作。

 

 

你可能感兴趣的:(中缀表达式和后缀表达式)