Basic Calculator II

来源:互联网 发布:怎么查网络延迟 编辑:程序博客网 时间:2024/06/03 22:43

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, +, -, *, / operators and empty spaces. The integer division should truncate toward zero.

You may assume that the given expression is always valid.

Some examples:

"3+2*2" = 7" 3/2 " = 1" 3+5 / 2 " = 5

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

第一遍做用的是递归来做,有些复杂,当运算的数很多时会报java.lang.StackOverflowError的错误!

这里有个容易忽略的点例如"1-2+3",这样下一步得到的"-1+3"会以负号开头,所以要小心。

public class Solution {    public int calculate(String s) {String str=s.replace(" ", "");return calculateStr(str);    }public int calculateStr(String str) {// TODO Auto-generated method stubboolean negtiveStart=false;if(str.charAt(0)=='-'){negtiveStart=true;}int left;if(isDigit(str))return Integer.parseInt(str); int idx=1;while(str.charAt(idx)>='0'&&str.charAt(idx)<='9'){idx++;}if(negtiveStart){str=str.substring(0);}left=Integer.parseInt(str.substring(0, idx));if(str.charAt(idx)=='+'){int right=calculateStr(str.substring(idx+1));return left+right;}if(str.charAt(idx)=='-'){String rightStr=str.substring(idx+1);if(isDigit(rightStr)){int right=Integer.parseInt(str.substring(idx+1));return left-right;}else{int nextIdx=idx+1;while(str.charAt(nextIdx)>='0'&&str.charAt(nextIdx)<='9'){nextIdx++;}int right=Integer.parseInt(str.substring(idx+1, nextIdx));return calculateStr(left-right+str.substring(nextIdx));}}if(str.charAt(idx)=='*'){String rightStr=str.substring(idx+1);if(isDigit(rightStr)){int right=Integer.parseInt(str.substring(idx+1));return left*right;}else{int nextIdx=idx+1;while(str.charAt(nextIdx)>='0'&&str.charAt(nextIdx)<='9'){nextIdx++;}int right=Integer.parseInt(str.substring(idx+1, nextIdx));return calculateStr(left*right+str.substring(nextIdx));}}if(str.charAt(idx)=='/'){String rightStr=str.substring(idx+1);if(isDigit(rightStr)){int right=Integer.parseInt(str.substring(idx+1));return left/right;}else{int nextIdx=idx+1;while(str.charAt(nextIdx)>='0'&&str.charAt(nextIdx)<='9'){nextIdx++;}int right=Integer.parseInt(str.substring(idx+1, nextIdx));return calculateStr(left/right+str.substring(nextIdx));}}return 0;} public boolean isDigit(String str) {// TODO Auto-generated method stubint idx=0;while(idx<str.length()&&str.charAt(idx)>='0'&&str.charAt(idx)<='9'){idx++;}if(idx==str.length()){return true;}return false;}}
这个题应该用栈来解决:

public class Solution {      public int calculate(String s) {          if(s==null || s.length()==0) return 0;                    LinkedList<Integer> list = new LinkedList<Integer>();                    for(int i=0; i<s.length(); i++) {              char c = s.charAt(i);              if(Character.isDigit(c)) {                  int cur = c-'0';                  while(i+1<s.length() && Character.isDigit(s.charAt(i+1))) {                      cur = cur * 10 + s.charAt(i+1) - '0';                      ++i;                  }                  if(!list.isEmpty() && (list.peek() == 2 || list.peek()==3)) {                      int op = list.pop();                      int opl = list.pop();                      int res = 0;                      if(op==2) res = opl * cur;                      else res = opl / cur;                      list.push(res);                  } else {                      list.push(cur);                  }                             } else if(c==' ') continue;              else {                  switch (c) {                      case '+': list.push(0);                      break;                      case '-': list.push(1);                      break;                      case '*': list.push(2);                      break;                      case '/': list.push(3);                      break;                      default: return -1;                  }              }          }                    if(list.isEmpty()) return 0;          Collections.reverse(list);                    int res = list.poll();                    while(!list.isEmpty()) {              int op = list.poll();              int opr = list.poll();              if(op==0) res += opr;              else res -= opr;          }          return res;      }  }  



0 0
原创粉丝点击