实现一个简单的计算器

文章摘要

两个栈

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
public int calculate(String s) {
Deque<Integer> stack = new LinkedList<Integer>();
char preSign = '+';
int num = 0;
int n = s.length();
for (int i = 0; i < n; ++i) {
//判断这个字符是否是数字
if (Character.isDigit(s.charAt(i))) {
//字符和字符的加减法都是用的对应的ASCII来进行的,由于字符对应的ASCII码也是按照数字的大小来的,所以直接就相当于字符直接相加减
num = num * 10 + s.charAt(i) - '0';
}
if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == n - 1) {
switch (preSign) {
case '+':
stack.push(num);
break;
case '-':
stack.push(-num);
break;
case '*':
stack.push(stack.pop() * num);
break;
default:
stack.push(stack.pop() / num);
}
preSign = s.charAt(i);
num = 0;
}
}
int ans = 0;
while (!stack.isEmpty()) {
ans += stack.pop();
}
return ans;
}

一个栈

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
public static  double calculate(String s)
{
int len=s.length();
char[] str=s.toCharArray();
Stack<Integer> st_num=new Stack<>();
char op='#'; //记录乘除符号
int ans=0,sign=1; //记录加减符号
for(int i=0;i<len;i++){
if(str[i]==' ') continue;
if(str[i]>='0'&&str[i]<='9'){
int num=str[i]-'0';
while(i<len-1&&str[i+1]>='0'&&str[i+1]<='9') //找完这个数
num=num*10+(str[++i]-'0');
if(op!='#'){ //如果之前有乘除符号
if(op=='*')num*=st_num.pop(); //则将这个数运算之后,再重新进栈
else num=st_num.pop()/num;
op='#'; //重置乘除符号
}
st_num.push(num);
}
else if(str[i]=='*'||str[i]=='/') op=str[i]; //更新乘除符号
else{ //遇到加减符号则可以直接更新ans了
ans+=st_num.pop()*sign;
sign=str[i]=='+'?1:-1; //更新加减符号
}
}
return ans+st_num.pop()*sign; //sign更新后,还有一次未计算
}