目录
项目思路:
项目用到的图片/gitee地址
项目代码:
判断优先级的方法:
判断优先级
进行计算,并返回结果
main方法中的代码
项目思路:
1.通过index来遍历输入的表达式,将数字和+-*/分开
2.如果用index发现的是数字则直接进入数栈numStack
3.如果index扫描到一个符号,就分为如下情况:
3.1如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或等于栈中的操作符,就需要将numStack中pop出两个数字,并将符号栈弹出一个符号进行计算,并将结果放到数栈numStack中,并重新判断该操作符是否小于或等于栈顶的操作符,即可以将index-1就可以了,然后用index接着遍历字符串。
3.2如果符号栈中无操作符,就将操作符入符号栈。
4.如果表达式扫描完毕,就顺序的从数栈弹出pop两个数字,符号栈弹出一个符号,进行运算。
5.最后的结果在numStack中,并且只有一个数字。将栈顶弹出。
项目用到的图片/gitee地址
个位数计算器https://gitee.com/ALi_L/javaDataStructurs.git
项目代码:
判断优先级的方法:
注解:注释可以更好的解决减法的问题
//判断优先级的
public static int priority(int oper){
if(oper == '*' || oper == '/'){
return 3;
}
//此处是为了将-与+的优先级分开
// else if (oper == '-'){
// return 2;
// }
else {
return 1;
}
}
判断优先级
注解:这个较简单
//判断是否为运算符
public static boolean isOper(char val){
boolean res = (val == '*' || val == '/' || val == '+' || val == '-');
return res;
}
进行计算,并返回结果
注:注意减法与除法,是后一个数减去前一个数
//进行计算并返回计算结果
public static int cal(int num1,int num2,int oper){
int res = 0;
switch (oper){
case '*':
res = num1 * num2;
break;
case '/':
res = num2 / num1;
break;
case '+':
res = num1 + num2;
break;
case '-':
res = num2 - num1;
break;
default:
break;
}
return res;
}
main方法中的代码
注:这个是项目的核心。39行代码可以解决减法存在的bug
public static void main(String[] args){
String str = "1-1*1+9";
int res = 0;
int num1 = 0;
int num2 = 0;
int oper = 0;
char ch = ' ';//扫描用的
int index = 0;
ArrayStack numberStack = new ArrayStack(10);
ArrayStack operStack = new ArrayStack(10);
while (true){
ch = str.charAt(index);
if(isOper(ch)){
//是操作符的时候执行下面的代码
if(operStack.isEmpty()){
//符号栈为空直接进栈
operStack.push(ch);
}else {
//如果当前的运算符比栈顶的运算符优先级低,则进行计算,并将结果放在numberStact中
//否则直接进栈
if (priority(ch) <= priority(operStack.peek())) {
num1 = numberStack.pop();
num2 = numberStack.pop();
oper = operStack.pop();
res = cal(num1, num2, oper);
numberStack.push(res);
//计算后将运算符放入符号栈operStack
// operStack.push(ch);
//上面的两行是直接将符号入栈了,存在bug:如计算:1-1*1+9
//此处不应该将运算符直接放进符号栈,需要再次进行判断,上面的if判断条件必须有=号,
// 否则就将-的优先级比+高才可以
index--;
} else {
operStack.push(ch);
}
}
}
//是数字的时候
else {
numberStack.push(ch-48);
}
index++;
if(index >= str.length()){
break;
}
}
//全部入栈后,计算最后的结果
while (true){
if(operStack.isEmpty()){
break;
}
num1 = numberStack.pop();
num2 = numberStack.pop();
oper = (char)operStack.pop();
res = cal(num1,num2,oper);
numberStack.push(res);
}
//取出栈顶的元素,并且不弹出栈
System.out.println(numberStack.peek());
}



