您的位置:首页 > 编程语言 > Java开发

LeetCode-227. Basic Calculator II (JAVA)实现计算器 II

2017-04-30 09:54 369 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息