实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
int start = 0;
public int calculate(String s) {
//遇到优先级高的先入栈,计算优先级高的
Stack<Integer> st = new Stack<>();//操作数栈
Stack<Character> op = new Stack<>();//操作符栈
start = 0;
while(start<s.length()){
if(s.charAt(start)==' '){//空格
start++;
}else if(s.charAt(start)=='+' || s.charAt(start)=='-' || s.charAt(start)=='*' || s.charAt(start)=='/'){
//遇到运算符入栈
op.push(s.charAt(start++));
}else{
int cur = getNum(s, start);//获取当前数字
if(!op.empty() && (op.peek()=='*' || op.peek()=='/')){//只计算乘除
char ch = op.pop();
int last = st.pop();
if(ch == '*'){
cur *= last;
}else if(ch == '/'){
cur = last/cur;
}
}
st.push(cur);
}
}
int ret = 0;
while(!op.empty()){//计算加减,减在对应数字上取负
char ch = op.pop();
int last = st.pop();
if(ch == '-'){
ret += (-last);
}else{
ret += last;
}
}
ret += (st.pop());//剩余第一个正数
return ret;
}
int getNum(String s, int index){
//截取一段连续的数字
int i=index+1;
for(; i<s.length() ; i++){
int tmp = s.charAt(i)-'0';
if(tmp>9 || tmp<0){
break;
}
}
int ret = Integer.valueOf(s.substring(index,i));
start = i;
return ret;
}
}