标签:alc 没有 ring 表达式 lse 简单的 ret 操作 一个
感觉自己的思路还不错,比较简单清晰,代码量也比较少,没有用到记录运算符的变量或栈,就想把这个思路发一下博客。
题目:
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,"+", "-", "*", "/" 四种运算符和空格 " "。 整数除法仅保留整数部分。
思路:
使用一个栈用于暂存得不到计算的数字(无法确定优先级,比如当前是"+",那么可能下一个操作符是"*",所以暂时无法计算)。最终乘除操作符两侧的数会被得到计算并push进栈,最后相加即可。比如:
2 - 1 + 3 * 4 - 4 / 2 * 1 => 2 - 1 + [ 3 * 4 ] + [ -4 / 2 * 1 ] => 最终栈里面的情况为 [2, -1, 12, -2],然后计算和即可。
情况如下:
class Solution {
public int calculate(String s) {
Deque<Integer> stack = new ArrayDeque<>();
char ch;
int[] ret;
for (int i = 0; i < s.length(); i++) {
ch = s.charAt(i);
if (ch == ‘ ‘)
continue;
ret = getNextNumber(s, i);
if (Character.isDigit(ch) || ch == ‘+‘) {
stack.push(ret[0]);
} else if (ch == ‘-‘) {
stack.push(-ret[0]);
} else if (ch == ‘*‘) {
stack.push(stack.pop() * ret[0]);
} else if (ch == ‘/‘) {
stack.push(stack.pop() / ret[0]);
}
i = ret[1]; //调整索引为,获得的下一个数字的末尾索引
}
// 返回计算结果
int[] ans = {0};
stack.forEach(num -> ans[0] += num);
return ans[0];
}
// 返回下一个数字
private int[] getNextNumber(String s, int i) {
int num = 0;
while (!Character.isDigit(s.charAt(i)))
i++;
while (i < s.length() && Character.isDigit(s.charAt(i)))
num = 10 * num + s.charAt(i++) - ‘0‘;
return new int[] {num, i-1}; // 返回得到的数字及该数字最后一个数字字符的索引
}
}
标签:alc 没有 ring 表达式 lse 简单的 ret 操作 一个
原文地址:https://www.cnblogs.com/yuanyb/p/11959305.html