实现一个简单的计算器

文章摘要

两个栈

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

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
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

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更新后,还有一次未计算

}