中缀表达式转后缀表达式并进行计算(原理)

在计算一个表达式的时候,可以用数据结构中栈的知识,将我们平常熟悉的中缀表达式转为后缀表达式,再将后缀表达式进行计算得到结果。先说下什么是中缀什么是后缀:

中缀表达式:eg: 9+(3-1)*3+10/2,就是我们平常计算时的表达式;

后缀表达式:eg: 9 3 1 - 3 * + 10 2 / + ,不包含括号,运算符在两个运算对象后面的表达式。

1.中缀表达式转后缀表达式

我们先初始化一个空的字符串(String)和栈(Stack),将这个中缀表达式中的数字和运算符(包括加减乘除及左右括号)分割成一个个字符串存进一个新的数组中,比如上面的中缀表达式就存为:9 + ( 3 - 1 ) * 3 + 10 / 2 (简便起见用空格将一个个字符串隔开了…) 然后遍历这个数组,运算对象就直接放进刚才初始化的String中,栈中存放的是运算符。如果是空栈,加减乘除或左括号就直接进栈,如果栈不为空,此时扫描到的运算符与栈顶运算符做优先级比较,如果栈顶运算符优先级低于扫描的运算符,则当前扫描运算符入栈,否则栈顶运算符弹栈并连接在String后,并与弹栈后的站定运算符再做比较,直到站定运算符低于当前扫描的运算符或遇到左括号,并将当前运算符进栈;当前运算符若是右括号,则将栈顶运算符依次弹出并依次连接到String后,直到遇到左括号,并将左括号弹出(但是不连接在String后的,注意后缀表达式中是没有括号的)。如果中缀表达式遍历完毕后栈中还有运算符则将栈中剩下的运算符依次弹出并连接在String后面;最终得到的就是字符串String后缀表达式。

2.后缀表达式的计算

先初始化一个栈,这个栈是用来存放操作数的,然后定义一个变量存放最后的结果。从String中遍历到数字则依次进栈,遍历到操作符的时候将栈顶操作数弹出(假设赋给变量a,作为右操作数),再将此时的栈顶操作数弹出(假设赋给变量b,作为左操作数),用后者对前者做该操作符对应的运算(假设遍历当前的操作符为+,则做计算b+a),然后将计算结果入栈。以此方式遍历整个字符串String,最终的结果即为运算结果。

猜你喜欢

转载自blog.csdn.net/zy1049677338/article/details/80453271