构建栈计算器

1.思路

一个个扫描每个字节看尸数字还是符号,分别加入不同的栈构建两个栈,一个数字栈,一个符号栈,符号栈威空直接压入或者要压的元素比栈顶的元素优先级高,就压入,否则就弹出两个数字和一个符号,计算结果,然后压入数字栈,再用那个符号与栈顶的符号比较,直到结束。

2.bug如果是多位数,会变成多个个位数不是百位数等

解决方法,扫描是数字接着扫直到不是数字才停止

3.代码

3.1分辨是符号还是数字

1
2
3
4
public static boolean isoper(char ch){

return ch=='-'||ch=='+'||ch=='/'||ch=='*';
}

3.2符号优先级

1
2
3
4
5
6
7
8
9
public static int priority(int val){
if (val=='+'||val=='-'){
return 0;
}else if (val=='/'||val=='*'){
return 1;
}else {
return -1;
}
}

3.3计算两个弹出的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static int result(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;

}

3.4主要代码

1.思路

一个个扫描每个字节看尸数字还是符号,分别加入不同的栈构建两个栈,一个数字栈,一个符号栈,符号栈威空直接压入或者要压的元素比栈顶的元素优先级高,就压入,否则就弹出两个数字和一个符号,计算结果,然后压入数字栈,再用那个符号与栈顶的符号比较,直到结束。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public static void main(String[] args) {
Stack<Integer> num=new Stack<>();
Stack<Character> oper=new Stack<>();
String express="322+3*6-2";
for (int i = 0; i < express.length(); i++) {
char ch=express.charAt(i);
if (isoper(ch)){
if (!oper.isEmpty()){
char ch1=oper.peek();
if (priority(ch)<=priority(ch1)){
int num1=num.pop();
int num2=num.pop();
char ch3=oper.pop();
int result=result(num1,num2,ch3);
num.push(result);
oper.push(ch);
}else {
oper.push(ch);
}

}else {
oper.push(ch);
}

}else {
//num.push(ch-48);
//如果出现多位数,不是分开加入
String addn="";
addn+=ch;
for (int j = i+1; j <express.length() ; j++) {
char ch2=express.charAt(j);
if (isoper(ch2)){
i=j-1;
//跳出去就是i+1,这个j会被跳过
break;
}else {
addn+=ch2;
}
}
num.push(Integer.parseInt(addn));
}
}

while (!oper.isEmpty()){
int num1=num.pop();
int num2=num.pop();
char ch=oper.pop();
int result=result(num1,num2,ch);
num.push(result);
}
System.out.println(num.peek());
}