Java简单实现计算器——用数组实现栈
原文链接:https://blog.csdn.net/qq_39355828/article/details/117414362 (opens new window)
# Java简单实现计算器——用数组实现栈
参考尚硅谷 数据结构视频
package DataStructures.stack;
import java.util.Scanner;
class ArrayStack2
{
private int maxSize;//栈的容量
private int[] stack;
private int top=-1;
public ArrayStack2(int maxSize)//初始化栈的大小
{
this.maxSize=maxSize;
stack=new int[this.maxSize];
}
public boolean Full()//判断是否栈满
{
return top==maxSize-1;
}
public boolean Empty()
{
return top==-1;
}
//入栈
public void push(int value)
{
if(Full()) {
System.out.println("The stack is full!");
return;
}
top++;
stack[top]=value;
}
//出栈
public int pop()
{
if(Empty())
{
System.out.println("The stack is empty!");
return 0;
}
int temp=stack[top];
top--;
return temp;
}
//遍历栈
public void displayStack()
{
if(Empty())
System.out.println("The stack is empty!");
int temp=top;
for(int i=0;i<=temp;i++)
{
System.out.printf("stack[%d] %d\n",i,stack[i]);
System.out.println(" ");
}
}
//返回栈顶
public int peek()
{
return stack[top];
}
public int priority(char oper)
{
if(oper=='*'||oper=='/')//优先级比较高的操作符
{
return 1;
}
else if(oper=='+'||oper=='-')//优先级比较低的操作符
return 0;
else
return -1;
}
//判断是不是一个运算符
public boolean ioOrder(char val)
{
return val=='+'||val=='-'||val=='*'||val=='/';
}
//计算方法
public 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;
}
}
public class Calculator {
public static void main(String[] args) {
String exp="3+2*6-2";
//创建两个栈,数栈,一个符号栈
ArrayStack2 numStack=new ArrayStack2(10);
ArrayStack2 operStack=new ArrayStack2(10);
int index=0;//用于扫描
int num1=0;
int num2=0;
int oper=0;
int res=0;
char ch=' ';
while(true)
{
ch=exp.substring(index,index+1).charAt(0);
System.out.println(ch);
//判断ch是什么
if(operStack.ioOrder(ch))
{
if(!operStack.Empty())
{
//如果符号栈中有运算符 要比较
if(operStack.priority(ch)<=operStack.priority((char) operStack.peek()))
{
num1=numStack.pop();
num2=numStack.pop();
oper=operStack.pop();
res=numStack.cal(num1,num2,oper);
//运算结果加入数栈
numStack.push(res);
operStack.push(ch);
}
else
{
operStack.push(ch);
}
}
else
{
operStack.push(ch);
}
}
else
numStack.push(ch-48);
//判断是否扫描到最后
index++;
if(index>=exp.length())
{
break;
}
}
while (true)//符号栈为空,数栈中只有一个数值
{
if(operStack.Empty())
break;
num1=numStack.pop();
num2=numStack.pop();
oper=operStack.pop();
res=numStack.cal(num1,num2,oper);
numStack.push(res);
}
System.out.printf("表达式结果%s =%d ",exp,numStack.pop());
}
}
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
编辑 (opens new window)
上次更新: 2026/08/11, 13:36:18