实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+
, -
,*
,/
四种运算符和空格
。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2" 输出: 7
示例 2:
输入: " 3/2 " 输出: 1
分析:
题目不难,仔细读题发现式子中含有空格,别忘了处理。本题有通用做法:先把中缀表达式变为后缀表达式(使用辅助栈)在进行计算。但是本题简单之处在于只有两级运算 +- 和 */ 所以我们可以进行两遍计算,第一遍先计算乘除,第二遍累加所有结果。
代码:
public static int calculate(String s) {
Deque<Integer> stack=new ArrayDeque<>();
int result=0,num=0;
char c='+'; //记录上一个符号
s=s.replaceAll(" ","");
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i)<='9' && s.charAt(i)>='0'){ //数字记录
num=num*10+s.charAt(i)-'0';
}
if(s.charAt(i)<'0' || i==s.length()-1){ //字符是算术符 或者到达字符末尾
switch (c){
case '+':
stack.push(num);
break;
case '-':
stack.push(-num);
break;
case '*':
stack.push((num)*stack.pop());
break;
case '/':
stack.push(stack.pop()/num);
break;
}
num=0; //重新加数 记录符号位
c=s.charAt(i);
}
}
while (!stack.isEmpty()) result+=stack.pop();
return result;
}