题目描述
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。
示例
示例 1:
- 输入: “1 + 1”
- 输出: 2
示例2:
- 输入: " 2-1 + 2 "
- 输出: 3
示例 3:
- 输入: “(1+(4+5+2)-3)+(6+8)”
- 输出: 23
题解
我的妈呀这个题提交了n次终于通过了。没有想到特殊情况比如输入是这种“ 33”或者(33)或者1-(33)。
设置两个栈,一个数据栈存储数据,一个符号栈存储符号。
当符号是’)‘并且符号栈的大小大于1时,则在遇到符号栈栈顶元素是’('之前,打印符号栈栈顶元素,对数据栈中的数据计算,并将计算结果push到数据栈中;如果当前符号是‘+’或者‘-’并且符号栈顶元素是‘-’时,则需要抛出符号栈栈顶元素,以及数据栈中的前两个栈顶元素将计算结果push到数据栈中,再将当前符号push到符号栈中;如果符号栈栈顶元素不是‘-’,则直接将当前符号push到符号栈中;若当前符号是‘(’直接push;若当前符号是‘ ’,则继续循环;若当前符号是数字,则判断该字符后的几位是否都是数字,知道不是数字结束,将数字字符串转换成整型push到数据栈中。
字符串遍历结束,首先判断符号栈在栈顶元素不是‘(’的情况下是否为空,若不为空则对数据栈中的数据计算,计算结果push到数据栈;
最后返回数据栈中的栈顶元素。
public int calculate(String s) {
Stack<Integer> data=new Stack<>();
Stack<Character> ch=new Stack<>();
for(int i=0;i<s.length();i++) {
if(s.charAt(i)=='(') {
ch.push('(');
}else if(s.charAt(i)=='+') {
if(!ch.isEmpty()&&ch.peek()=='-') {
ch.pop();
int num1=data.pop();
int num2=data.pop();
int num=num2-num1;
data.push(num);
}
ch.push('+');
}else if(s.charAt(i)=='-') {
if(!ch.isEmpty()&&ch.peek()=='-') {
ch.pop();
int num1=data.pop();
int num2=data.pop();
int num=num2-num1;
data.push(num);
}
ch.push('-');
}else if(s.charAt(i)==' ') {
continue;
}else if(s.charAt(i)==')') {
if(ch.size()==1&&ch.peek()=='(')
continue;
else {
while(ch.peek()!='(') {
int num1=data.pop();
int num2=data.pop();
int num=0;
char c=ch.pop();
if(c=='+') {
num=num1+num2;
}else if(c=='-') {
num=num2-num1;
}
data.push(num);
}
ch.pop();
}
}else {
int index=i;
i++;
while(i<s.length()&&s.charAt(i)!='('&&s.charAt(i)!='+'&&s.charAt(i)!='-'
&&s.charAt(i)!=')'&&s.charAt(i)!=' ') {
i++;
}
data.push(Integer.parseInt(s.substring(index,i)));
i--;
}
}
while(!ch.isEmpty()&&ch.peek()!='(') {
int num1=data.pop();
int num2=data.pop();
int num=0;
char c=ch.pop();
if(c=='+')
num=num1+num2;
else if(c=='-')
num=num2-num1;
data.push(num);
}
while(!data.isEmpty())
return data.pop();
return 0;
}