返回
在栈的护航下,行走在数字世界的计算之旅
闲谈
2024-01-19 18:28:32
栈:理解其内在机制
栈,这种有着悠久历史的数据结构,以其先进后出的特点在计算机科学领域占据着不可替代的地位。想象一下一个套娃,你只能从最上面取下娃娃,而不能直接接触到里面的娃娃。栈遵循的就是这一原则:后加入的元素,必须先被取出,才能接触到之前加入的元素。
用栈构建简易计算器:将抽象化为现实
现在,让我们携手构建一个简易计算器,用栈来承载数字和运算符,踏上求解表达式之旅。
-
将表达式拆解为数字和运算符:
我们将表达式分成数字和运算符两个部分。数字可以直接压入栈中,而运算符则需要等待时机。
-
遇到数字,直接压栈:
当我们读到数字时,无需犹豫,直接将它压入栈中。
-
遇到运算符,等待时机:
当我们读到运算符时,我们需要等待另一个数字出现。一旦有了第二个数字,我们就可以进行计算,并将结果压入栈中。
-
不断循环,直至表达式结束:
我们不断重复上述步骤,直到表达式结束。此时,栈顶的元素就是表达式的值。
栈:实现代码的展现
为了让栈的计算过程更加清晰,我们用代码来展现:
import java.util.Stack;
public class SimpleCalculator {
public static void main(String[] args) {
String expression = "100+100/5-4";
System.out.println(evaluateExpression(expression));
}
private static int evaluateExpression(String expression) {
Stack<Integer> numbers = new Stack<>();
Stack<Character> operators = new Stack<>();
for (char c : expression.toCharArray()) {
if (Character.isDigit(c)) {
int number = c - '0';
numbers.push(number);
} else if (c == '+' || c == '-' || c == '*' || c == '/') {
operators.push(c);
} else if (c == ')') {
int operand2 = numbers.pop();
int operand1 = numbers.pop();
char operator = operators.pop();
int result = calculate(operand1, operand2, operator);
numbers.push(result);
}
}
return numbers.pop();
}
private static int calculate(int operand1, int operand2, char operator) {
switch (operator) {
case '+':
return operand1 + operand2;
case '-':
return operand1 - operand2;
case '*':
return operand1 * operand2;
case '/':
return operand1 / operand2;
default:
throw new IllegalArgumentException("Invalid operator: " + operator);
}
}
}
结语:踏上计算之旅
栈,一种看似简单的结构,却蕴含着强大的计算能力。通过构建简易计算器,我们得以一窥栈的魅力,领略算法之美。无论是在计算机科学领域,还是在日常生活中,栈都能为我们提供高效的解决方案。希望这篇博文能激发你的灵感,助你踏上计算之旅,探索更多精彩。