227. Basic Calculator II
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.
设计一个计算器,输入有效,并且只含有+
, -
, *
, /
,空格,全是非负整数
使用栈,栈内存的是所有的中间结果,最后把站内数据加起来,就是最终结果
// 支持"-1 * 5"但不支持"-1 * +5"
public int calculate(String s) {
int len;
if (s == null || (len = s.length()) == 0)
return 0;
Stack<Integer> stack = new Stack<Integer>();
int num = 0;
// sign记录本次数字之前的上一个运算符,初始值为'+',
char sign = '+';
for (int i = 0; i < len; i++) {
if (Character.isDigit(s.charAt(i))) {
num = num * 10 + s.charAt(i) - '0';
}
// 先乘除后加减
if ((!Character.isDigit(s.charAt(i))
// 非空格
&& ' ' != s.charAt(i))
// 到达字符串结束处,需要计算最后一次结果
|| i == len - 1) {
// 加减不计算结果,直接压入栈,运算符优先级
if (sign == '-') {
stack.push(-num);
}
if (sign == '+') {
stack.push(num);
}
// 乘除从栈中弹出一个数字计算结果,在压入栈
if (sign == '*') {
stack.push(stack.pop() * num);
}
if (sign == '/') {
stack.push(stack.pop() / num);
}
sign = s.charAt(i);
num = 0;
}
}
int res = 0;
for (int i : stack) {
res += i;
}
return res;
}
使用变量存储结果
public int calculate(String s) {
int res = 0, pre = 0, curr = 0;
char sign = '+';
char[] array = s.trim().toCharArray();
for (int i = 0; i <= array.length; i++) {
if (i != array.length
&& Character.isDigit(array[i]))
curr = curr * 10 + array[i] - '0';
else {
if (i != array.length && array[i] == ' ')
continue;
if (sign == '+') {
res += curr;
pre = curr;
}
if (sign == '-') {
res -= curr;
pre = -curr;
}
if (sign == '*') {
// 之前多加了一个pre(本身包括正负),现在减去
res = res - pre + pre * curr;
pre = pre * curr;
}
if (sign == '/') {
res = res - pre + pre / curr;
pre = pre / curr;
}
curr = 0;
if (i != array.length)
sign = array[i];
}
}
return res;
}