模拟只有加减乘除的计算器.....我们用一个栈来尽可能的将原表达式转化为若干个加法....(因为乘除法优先,所以不能从头直接算到尾)
例如,若每个数字的前一个运算符号是加号或者这个数字是第一个数的话:stack加入这个数
若这个数字之前的符号是减号的话,相当于加上这个数及其相关运算的负数,stack加入这个数的负数
若这个数字之前的符号是乘号或者除号时:由于这两种符号相比于栈中的加法拥有运算的优先级,我们需要利用这个数字之前的数字或更高优先级运算的值来先计算结果,再将结果存入栈即可.....
最后将栈中的各个值累加即为所求的最终结果.....
public class Solution {
public int calculate(String s) {
if( s==null||s.length()==0 )
{
return 0;
}
int len=s.length();
Stack<Integer> stack=new Stack<Integer>();
int num=0;
char flag='+';
for( int i=0;i<len;i++ )
{
if( Character.isDigit(s.charAt(i)) )
{
num=num*10+s.charAt(i)-'0';
}
if( (!Character.isDigit(s.charAt(i))&&s.charAt(i)!=' ')||i==len-1 )
{
if( flag=='+' )
{
stack.add(num);
}
if( flag=='-' )
{
stack.add(-num);
}
if( flag=='*' )
{
stack.add( stack.pop()*num );
}
if( flag=='/' )
{
stack.add( stack.pop()/num );
}
num=0;
flag=s.charAt(i);
}
}
int res=0;
for( int i:stack )
{
res+=i;
}
return res;
}
}