实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
思路:仍然用栈模拟即可。
class Solution {
public int calculate(String s) {
Stack st2=new Stack<>();
Stack<Integer> st1=new Stack<>();
StringBuilder str=new StringBuilder();
for(int i=0;i<s.length();i++)
{
if(s.charAt(i)==' ')
continue;
str.append(s.charAt(i));
}
s=str.toString();
if(s.length()==0)
return 0;
int sum=0,len=s.length(),x;
for(int i=0;i<len;i++)
{
if(s.charAt(i)>='0' && s.charAt(i)<='9')
{
sum=sum*10+(s.charAt(i)-'0');
if(i<len-1 && (s.charAt(i+1)<'0' || s.charAt(i+1)>'9') || i==len-1)
{
if(st1.isEmpty() || st2.isEmpty())
{
st1.add(sum);
continue;
}
if((char)st2.peek()!='+')
{
if((char)st2.peek()=='-')
{
if(i==len-1 || s.charAt(i+1)!='*' && s.charAt(i+1)!='/')
{
x=st1.pop();
st1.add(x-sum);
st2.pop();
}
else
st1.add(sum);
}
else
{
x=st1.pop();
if((char)st2.peek()=='/')
st1.add(x/sum);
else
st1.add(x*sum);
st2.pop();
if(!st2.isEmpty() && (i==len-1 || s.charAt(i+1)!='*' && s.charAt(i+1)!='/') && (char)st2.peek()=='-')
{
x=st1.pop();
int y=st1.pop();
st1.add(y-x);
st2.pop();
}
}
}
else
st1.add(sum);
}
}
else
{
sum=0;
st2.add(s.charAt(i));
}
}
while(!st2.isEmpty())
{
int xx=st1.pop();
int yy=st1.pop();
st1.add(xx+yy);
st2.pop();
}
return st1.peek();
}
}