227. Basic Calculator II
Medium
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.
题意
含有加减乘除的整数表达式判断
思路
由于只有2个优先级:乘除>加减,所以只需要用两个整型数和两个字符来存储之前的数和符号,主要是用来存储形如"a + b * "的式子。但是实际写代码之后发现还是用一个栈存储,很多地方可以用循环处理,更加方便
代码
class Solution {
public int calculate(String s) {
int num = 0, num1 = -1, num2 = -1;
char op1 = 0, op2 = 0;
boolean sign = true;
for (char ch: s.toCharArray()) {
if (ch == 0) {
continue;
} else if (ch >= '0' && ch <= '9') {
num = num * 10 + ch - '0';
} else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
if (op2 == '*') {
num2 *= num;
op2 = ch;
} else if (op2 == '/') {
num2 /= num;
op2 = ch;
} else if (op2 == 0 && op1 == '*') {
num1 *= num;
op1 = ch;
} else if (op2 == 0 && op1 == '/') {
num1 /= num;
op1 = ch;
} else if (op2 == '+' && (ch == '+' || ch == '-')) {
num2 += num;
op2 = ch;
} else if (op2 == '-' && (ch == '+' || ch == '-')) {
num2 -= num;
op2 = ch;
} else if (op2 == 0 && op1 == '+' && (ch == '+' || ch == '-')) {
num1 += num;
op1 = ch;
} else if (op2 == 0 && op1 == '-' && (ch == '+' || ch == '-')) {
num1 -= num;
op1 = ch;
} else if (op1 == 0) {
num1 = num;
op1 = ch;
} else if (op2 == 0) {
num2 = num;
op2 = ch;
}
if (op2 == '+' || op2 == '-') {
switch (op1) {
case '+':
num1 += num2;
break;
case '-':
num1 -= num2;
break;
case '*':
num1 *= num2;
break;
case '/':
num1 /= num2;
break;
}
op1 = op2;
op2 = 0;
}
num = 0;
// System.out.println(num1);
// System.out.println(op1);
// System.out.println(num2);
// System.out.println(op2);
// System.out.println(num);
// System.out.println("******");
}
}
if (op1 == 0) {
return num;
} else if (op2 == 0) {
switch (op1) {
case '+':
return num1 + num;
case '-':
return num1 - num;
case '*':
return num1 * num;
case '/':
return num1 / num;
}
} else {
switch (op2) {
case '*':
num2 *= num;
break;
case '/':
num2 /= num;
break;
}
switch (op1) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
}
}
return 0;
}
}