题目描述:
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
解题思路:
使用栈:数字栈
思路:* / 直接算,+ - 后面再算,最后只剩 + -,再while(!numStack.isEmpty){计算加减就行}
1.1 遍历字符串,是数字直接放到数字栈
1.2 若遇到字符,若是 * /,则从栈中弹出一个num进行计算
若是 +,则直接压入栈中
若是 -,则变成相反数再直接压入栈中
1.3 最后遍历数字栈,将所有数字求和即为表达式的结果
import java.util.Stack;
/**
* @author: Arbicoral
* @Description: 输入字符串 “3+2*2”,求结果。
*/
public class KuaiShou {
public static void main(String[] args) {
String s = "33+23*2-33-53/5";
System.out.println(s + " = " + calculate1(s));
System.out.println(s + " = " + calculate2(s));
}
/**
* 使用栈:数字栈
* 思路:* / 直接算,+ - 后面再算,最后只剩 + -,再while(!numStack.isEmpty){计算加减就行}
* 1.1 遍历字符串,是数字直接放到数字栈
* 1.2 若遇到字符,若是 * /,则从栈中弹出一个num进行计算
若是 +,则直接压入栈中
若是 -,则变成相反数再直接压入栈中
* 1.3 最后遍历数字栈,将所有数字求和即为表达式的结果
* @return 表达式的结果
*/
public static int calculate2(String expression) {
int num = 0;
int len = expression.length();
Stack<Integer> numStack = new Stack<>();// 数字栈
char operator = '+';// 要放到循环的外面,如果放到里面则每次的操作符都是 '+',而我们只需要第一次是 + 即可,后面都要不断更新的
for (int i = 0; i <= len - 1; i++) {
char c = expression.charAt(i);
if (Character.isDigit(c)){
num = num * 10 + (c - '0');
}
if (!Character.isDigit(c) && c != ' ' || i == len-1){
switch (operator) {
case '+' -> numStack.push(num);
case '-' -> numStack.push(-num);
case '*' -> numStack.push(numStack.pop() * num);
case '/' -> numStack.push(numStack.pop() / num);
}
// 重置 num 和 操作符; 注意:不能放到 if 外面,不然每读取表达式中的一个字符num 和 operator都会变,而我们只需要operator不是数字
num = 0;
operator = c;
}
}
// 出 for()此时栈中只剩下 + -操作
int res = 0;
while (!numStack.isEmpty()){
res += numStack.pop();
}
return res;
}
/**
* 思路:将字符串中的操作符全部变成 + ,即遇到 - 的则再取一个,然后变成对应的负数,遇到 * / 就直接计算,最后将栈中的所有数相加即可
*/
public static int calculate1(String expression) {
Stack<Integer> stack = new Stack<>();
int num = 0;
char operation = '+';
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (Character.isDigit(c)) {
num = num * 10 + (c - '0');
}
if (!Character.isDigit(c) && c != ' ' || i == expression.length() - 1) {
if (operation == '+') {
stack.push(num);
} else if (operation == '-') {
stack.push(-num);
} else if (operation == '*') {
stack.push(stack.pop() * num);
} else if (operation == '/') {
stack.push(stack.pop() / num);
}
num = 0;
operation = c;
}
}
int result = 0;
while (!stack.isEmpty()) {
result += stack.pop();
}
return result;
}
}