程序设计目的是用户可以输入中缀表达式,回车后计算出结果。
首先要知道中缀表达式如何转换成后缀(前缀)表达式,中缀表达式是人容易理解的表达式,而对计算机来说,计算中缀表达式是很困难的。所以我们先把中缀表达式转化成后缀表达式或者转换成前缀表达式后在计算。
中缀表达式是区分运算符优先级的,由于不同的运算符间存在优先级,同一优先级的运算间又存在着运算结合问题。所以简单地从左往右的计算是不可以的。而前缀和后缀表达式是不区分符号优先级的,且它们两个没有括号运算符。后缀表达式是从前面往后面读,而前缀表达式的区别在于它是从后面往前面读的。所以我们一般是把中缀表达式转换成后缀表达式来计算的。
这里我们用后缀表达式来讲解。表达式转换一般都是用到堆栈(简称“栈”),可以用顺序栈或链式栈,这里用顺序栈进行讲解,表达式转换的过程中,遇到运算数就直接输出,所以运算数的顺序是不会改变的,改变的只是运算符的顺序,所以表达式转换是要用到符号栈来保存运算符的。
应用栈将中缀表达式转换成后缀表达式的基本过程为:从头到尾读取中缀表达式的每个元素,运算规则分为下列5种:
(1)遇到运算数直接输出。
(2)遇到左括号直接将其压栈。
(3)若遇到是的右括号,表明括号内的中缀表达式已经扫描完毕,将栈顶的运算符依次出栈,直至遇到左括号,然后把左括号也弹出,但不输出(右括号是不入栈的)。
(4)遇到运算符,则与栈顶符号运算级对比,若当前运算符的运算级大于栈顶运算符的运算级,则入栈,而小于或等于都要先出栈,再把当前的运算符压栈。
(5)若中缀表达式计算完成,则将栈中剩余的运算符全部出栈。
在上述处理的过程的一个关键是不同运算符优先级的设置,在程序实现中,可以用一个数字来代表运算符的优先级,优先级越高,数值越大,在这里我是把左括号的优先级设为1,加号和减号设为2,乘号和除号设为3,右括号设为4(右括号可以不设置优先级)。
而转换成后缀表达式后,计算就比较简单了。求值要用到一个数据栈来保存运算数,而在前面的遇到运算数就不该直接输出了,而是遇到运算数就进数据栈,每当从符号栈出来一个符号,就要从数据栈中出两个数据,并且进行运算。运算完成后再将结果压入数据栈,直至表达式结束,而结束后,最后的计算结果就会栈数据栈中。
下面是代码的链接: