LeetCode 224. Basic Calculator

来源:互联网 发布:php查找字符串位置 编辑:程序博客网 时间:2024/06/05 07:16

224. Basic Calculator

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2" 2-1 + 2 " = 3"(1+(4+5+2)-3)+(6+8)" = 23

Note: Do not use the eval built-in library function.



【题目大意】

非常简单,看了例子就懂


思路

        1.对于此题我的想法是将所有整型依其前面的操作符来取正负 然后压栈,最后统一出栈后累加 即得所求
        2.我们必须设置一个字符变量sign来记录整型前的操作符,sign初始为+(本题不会出现负数参数)
        3.但是由于此题有括号的问题,所以必须先将括号里的值计算出来后再压栈,于是我对于括号值计算后的正负问题
           采取将操作符也入栈,这样就可以让计算出来的结果马上找到它的正负号
         
  


【代码】
   

  public static int calculate(String s) {    Stack<String> stack = new Stack<String>();    int result = 0;    s = s.trim(); //去除字符串前后所带空格    char c[] = s.toCharArray();    int len = c.length;    if(len == 1){    return Integer.parseInt(s);    }    int num = 0;    char sign = '+';    char preSign = '+';    for(int i=0;i<len;i++){    //当读到整型字符时 有可能前面的倍数是两位数以上故要 乘10后再累加if(Character.isDigit(c[i])){    num = num*10 + c[i]-'0';    }else{    //当读到的不是整型时,此时之前读的整型可入栈,若一开始是括号开头则入栈的num是0 也不影响计算    if(sign == '+'){    stack.push(num+"");    }else if(sign == '-'){    stack.push(-num+"");    }    //现在根据所读字符的不同取值采取不同解决方案    if(c[i] == '+'){//1.当读到的是操作符 +,则将sign的值改变   sign = '+';}else if(c[i] == '-'){//2.当读到的是操作符 -,则将sign的值改变sign = '-';}else if(c[i] == '('){//3.当读到的是'('时stack.push(sign+"");//将当前的sign值压栈,为了记录括号里值的正负sign = '+';//并且将其值改为+(默认无负值,则括号里第一个元素一定是正的)stack.push(c[i]+"");//将'('压栈是为了计算括号里的值时方便找到出口}else if(c[i] == ')'){//3.当读到的是')'时,//此时则将左括号之后入栈的元素依次出栈并且记录起累加值    int curResult = 0;    String temp = stack.pop();     while(!temp.equals("(") && !stack.isEmpty()){    curResult += Integer.parseInt(temp);    temp = stack.pop();    }        //此处提出左括号之前压栈的sign值 旨在为当前结果赋上正负号    preSign = stack.pop().charAt(0);    if(preSign == '+'){    stack.push(curResult + "");    }    if(preSign == '-'){       stack.push(-curResult + "");    }    }    num = 0;    }    }    //最后以数字结尾的话就会被漏掉 在此处添加判断    if(Character.isDigit(c[len-1])){    if(sign == '+')    stack.push(num+"");    if(sign == '-')    stack.push(-num+"");    }        //输出结果    if(stack.isEmpty()){    return num;    }else{    while(!stack.isEmpty()){    result += Integer.parseInt(stack.pop());    }        return result;    }    }


原创粉丝点击