代码实现
package com.atguigu.stack;
/**
* @author WHT
* @create 2021-06-09 21:05
*/
// 【王】 一个栈实现,比视频方法少创建一个栈。
public class Calculator {
public static void main(String[] args) {
// 给出待计算的表达式字符串。
String expression = "70+2*6-4"; // 可以处理多位数的运算。
// 创建一个栈。
ArrayStack2 stack = new ArrayStack2(20);
// 定义需要的相关变量。
int index = 0; // 用于遍历表达式。
int num1 = 0;
int num2 = 0;
int oper = 0;
int res = 0;
char ch = ' '; // 将每次扫描得到的char保存到ch。
String keepNum = ""; // 用于拼接多位数。(与只能处理一位数不同的地方)
// 开始while循环,扫描expression。
while (true) {
// 依次得到 expression 的每一个字符。
ch = expression.substring(index, index + 1).charAt(0);
// 判断ch是运算符还是数字,然后做相应的处理。
if (stack.isOper(ch)) { // 如果是运算符。
// 判断栈中是否有运算符。
if (stack.isFirstOper()) {
// 如果栈中没有运算符,入栈。
stack.push(ch);
// 遍历。
index++;
if (index >= expression.length()) {
break;
}
}
// 如果栈中有运算符,比较当前运算符与前一个运算符的优先级。
else if (stack.priority(ch) > stack.priority(stack.temp())) {
// 如果当前运算符的优先级大于前一个运算符的优先级,入栈。
stack.push(ch);
// 遍历。
index++;
if (index >= expression.length()) {
break;
}
}
// 如果当前运算符的优先级小于等于前一个运算符的优先级,出栈,并计算。
else {
num1 = stack.pop();
oper = stack.pop();
num2 = stack.pop();
res = stack.cal(num1, num2, oper);
// 将计算结果入栈。
stack.push(res);
}
}
// 如果是数字,入栈。
else {
// 处理多位数。(与只能处理一位数不同的地方)
keepNum += ch;
// 如果ch已经是expression的最后一位,就直接入栈。
if (index == expression.length() - 1) {
stack.push(Integer.parseInt(keepNum));
}
// 判断下一个字符是不是数字,如果是数字,就继续扫描;如果是运算符,则入栈。
// 如果后一位是运算符,keepNum入栈。
else if (stack.isOper(expression.substring(index + 1, index + 2).charAt(0))) {
stack.push(Integer.parseInt(keepNum));
keepNum = ""; // keepNum清空。
}
// 遍历。
index++;
if (index >= expression.length()) {
break;
}
}
}
// 将栈中的元素出栈,并计算,就是表达式的最终结果。
num1 = stack.pop();
oper = stack.pop();
num2 = stack.pop();
res = stack.cal(num1, num2, oper);
System.out.printf("表达式 %s = %d", expression, res);
}
}
运行结果
D:\java\jdk-11.0.11\bin\java.exe "-javaagent:D:\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=6226:D:\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath E:\WHT\Project\Java\DataStructures\out\production\DataStructures com.atguigu.stack.Calculator
表达式 70+2*6-4 = 78
Process finished with exit code 0