在上周的ACM入门课上,老师为了计算中缀表达式而引入了后缀表达式的概念,并布置作业:输入一个中缀表达式,输出其后缀表达式。
如输入:5+2*(3+4)*5-3 输出:5 2 3 4 + * 5 * + 3 -
我在解决了这个问题后,忽然就想到不如就顺便解决最终问题。
分析:输入的是中缀表达式,要输出其运算结果,需要考虑到各种运算优先级问题,所以应先应用上面的结果,把中缀表达式转化为后缀表达式,再计算后缀表达式。
步骤:1.转化:我首先想的是没有括号的情况,因为括号不是运算符,只是改变运算优先级的。鉴于这里要把得到的后缀表达式保存下来,所以用一个数组stored保存,遇到数字就直接保存。关键是遇到运算符的情况。因为非常有可能后面的比前面的更优先运算,满足后进先出特点,用栈stack保存运算符。若当前运算符和栈顶运算符优先级相同,则可以看做栈顶的运算符先做;若当前的运算符比栈顶的运算符优先级低,则栈内的运算应全部做完,再轮到当前的运算符;其他情况则不操作。上述三种情况处理后都要将当前运算符压入栈。
很明显,运算符只有两种优先级,那么不难得到栈内元素最多就是两个。因为若优先级相同,则输出前一个,压入当前,即不改变栈的元素个数,而优先级较大,则直接压入栈,但不可能连续出现较大的情况,所以最多只可能多一个即两个。而较小就清空了。
这样