224. 基本计算器
问题
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式可以包含左括号
(
,右括号)
,加号+
,减号-
,非负整数和空格。
示例 1:
输入: "1 + 1" 输出: 2
示例 2:
输入: " 2-1 + 2 " 输出: 3
示例 3:
输入: "(1+(4+5+2)-3)+(6+8)" 输出: 23
思路
用两个栈实现,一个操作数栈,一个操作符栈
import java.util.*;
class Solution {
public int calculate(String s) {
Stack<Integer> numStack=new Stack<>();
Stack<Character> opStack=new Stack<>();
int i=0;
while(i<s.length()) {
char c=s.charAt(i);
if(c==' ') {
i++;
continue;
}
if(c>='0'&&c<='9') {
int sum=c-'0';
i++;
while(i<s.length()&&s.charAt(i)>='0'&&s.charAt(i)<='9') {
sum=sum*10+s.charAt(i)-'0';
i++;
}
numStack.push(sum);
continue;
}
if(c==')') {
char op=opStack.pop();
while(op!='(') {
int num1=numStack.pop();
int num2=numStack.pop();
int result=0;
if(op=='-') {
result=num2-num1;
} else if(op=='+') {
result=num2+num1;
}
numStack.push(result);
op=opStack.pop();
}
i++;
continue;
}
if(c=='(') {
opStack.push(c);
} else if(opStack.isEmpty()||opStack.peek()=='(') {
opStack.push(c);
} else {
int num1=numStack.pop();
int num2=numStack.pop();
int result=0;
if(opStack.peek()=='-') {
result=num2-num1;
} else if(opStack.peek()=='+') {
result=num2+num1;
}
numStack.push(result);
opStack.pop();
opStack.push(c);
}
i++;
}
while(!opStack.isEmpty()) {
int num1=numStack.pop();
int num2=numStack.pop();
int result=0;
if(opStack.peek()=='-') {
result=num2-num1;
} else if(opStack.peek()=='+') {
result=num2+num1;
}
numStack.push(result);
opStack.pop();
}
return numStack.pop();
}
}