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.
Example 1:
Input: "3+2*2" Output: 7
Example 2:
Input: " 3/2 " Output: 1
Example 3:
Input: " 3+5 / 2 " Output: 5
Note:
- You may assume that the given expression is always valid.
- Do not use the
eval
built-in library function.
我的解法:
先把字符串s的符号和数字解开,这里要注意切分的逻辑要合理,不要遗漏最后一个数字。之后用一个堆栈就解决问题了,遇到乘法和除法就去除前后数,做完处理之后再放回。
总觉得我代码又长又臭。。。
class Solution {
public int calculate(String s) {
s=s.replaceAll("\\s+","");
Stack<Integer> st = new Stack<Integer>();
int len = s.length();
if(len == 0) return 0;
List<String> ope = new ArrayList<String>();
//切开数字和符号
int v = 0;
for(int i=0;i<len;i++){
if(s.charAt(i)=='+' ||s.charAt(i)=='-'|| s.charAt(i)=='*'|| s.charAt(i)=='/' ){
ope.add(s.substring(v,i));
ope.add(s.substring(i,i+1));
v = i+1;
}
}
ope.add(s.substring(v,len));
len = ope.size();
if(len<=1)return Integer.parseInt(s);
int res = 0;
for(int i=0; i<len; i++){
if(ope.get(i).equals("*")){
int temp = st.pop() * Integer.parseInt(ope.get(i+1));
i++;
st.push(temp);
continue;
}else if (ope.get(i).equals("/")){
int temp = st.pop()/Integer.parseInt(ope.get(i+1));
i++;
st.push(temp);
continue;
}else if(ope.get(i).equals("+")){
continue;
}else if(ope.get(i).equals("-")){
st.push(-Integer.parseInt(ope.get(i+1)));
i++;
continue;
}else{
st.push(Integer.parseInt(ope.get(i)));
}
}
while(!st.isEmpty()){
res = res + st.pop();
}
return res;
}
}