四则运算项目实现
项目介绍
最开始的计算器只能进行两个数之间的运算,而不能进行复杂的如“9+((3*2)+(3-1))/2” 这样的四则运算。后来一名波兰的逻辑学家发明了后缀表达式(或称为逆波兰表达式),非常巧妙地解决了程序实现四则运算的难题。
后缀表达式是一种把所有运算符都放在运算数字后面出现的式子,所以被称为后缀表达式,这样就解决了运算优先级和括号的问题。而中缀表达式就是我们平常用的标准四则运算表达式,即“9+((3*2)+(3-1))/2”。在计算机计算一个标准四则运算表达式时,都是先将中缀表达式转化为后缀表达式,然后进行计算。
例如中缀表达式“9+((3*2)+(3-1))/2”转化为后缀表达式“9 3 2 * 3 1 - + 2 / +”。
项目功能
模拟计算器进行四则运算表达式求值的过程
项目实现思路
1、中缀表达式转换为后缀表达式过程
规则:
从左到有遍历中缀表达式的每个数字和符号,若是数字就输出,及称为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最后输出后缀表达式为止。
2、后缀表达式计算结果
规则:
从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到符号就处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终结果
代码实现
/**
* 逆波兰式(四则运算)
*/
public class InversePolandStyle {
private static String suffix = ""; //后缀表达式
private static char SEPARATOR = ' '; //分隔符,用于数与数,数与符号,符号与符号之间分开,便于判断
/**
* 后缀表达式运算
* @param suffix 后缀表达式
* 思路:从左到右遍历后缀表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,
* 就将处于栈顶两个数字出栈,进行运算,运算结果入栈,一直到最终获得结果
*/
public static void SuffixExpressionOperation(String suffix){
MyOrderStack<Integer> myStack = new MyOrderStack<>(suffix.length());
//从左到右遍历后缀表达式的每个数字和符号
for(int suffixIndex = 0;suffixIndex < suffix.length();suffixIndex++){
if(suffix.charAt(suffixIndex) == SEPARATOR){
continue; //若目前下标字符是分隔符,更新suffixIndex,继续进行遍历
}
//若目前下标字符是数字,将其转换为Integer类型进行入栈操作
if(Character.isDigit(suffix.charAt(suffixIndex))){
Integer number = 0; //定义一个Integer类型的number临时存储转换数字
//利用分隔符判断是否存在两位及以上数字存在
while (suffixIndex+1 < suffix.length() && suffix.charAt(suffixIndex) != SEPARATOR){
//进行类型转换,将字符类型的数字转换为Integer类型
number = number * 10 + suffix.charAt(suffixIndex++)-'0';
}
myStack.push(number);