Stack是一个非常基本且实用的数据结构,遵循后进先出(Last-In-First-Out, LIFO)原则,即最后存入堆栈的元素将最先被取出。
什么是堆栈?
想象一下一堆盘子堆在一起,每次只能从最上面拿盘子或者往最上面放盘子。这就是堆栈的基本思想——后进先出(LIFO, Last In First Out)。在计算机科学中,堆栈是一种数据结构,限制元素的添加和移除只能在一端进行,这一端被称为栈顶,另一端是栈底,不允许访问。
Stack的基本概念
术语 | 概念 |
后进先出(LIFO) | 最后一个被添加到堆栈中的元素总是第一个被移除的元素。 |
顶部(Top) | 堆栈的顶部是最后添加的元素的位置。 |
底部(Bottom) | 堆栈的底部是第一个被添加的元素的位置。 |
空栈(Empty Stack) | 没有元素的堆栈称为空栈。 |
满栈(Full Stack) | 当堆栈没有更多的空间来添加新元素时,被称为满栈。但在实际实现中,由于动态内存分配,这种情况并不常见。 |
Java Stack类的主要方法
方法 | 描述 |
push(E item) | 将元素推入堆栈顶部。 |
pop() | 移除堆栈顶部的元素并返回它。如果堆栈为空,则抛出EmptyStackException。 |
peek() | 返回堆栈顶部的元素但不移除它。如果堆栈为空,则抛出EmptyStackException。 |
empty() | 测试堆栈是否为空。 |
search(Object o) | 返回对象在堆栈中的位置(从1开始计数)。如果对象不在堆栈中,则返回-1。 |
使用Stack类的示例
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack stack = new Stack<>();
// 添加元素到堆栈
stack.push("Element 1");
stack.push("Element 2");
stack.push("Element 3");
// 查看堆栈顶部元素
System.out.println("Top element: " + stack.peek());
// 移除并打印堆栈顶部元素
System.out.println("Popped element: " + stack.pop());
// 遍历并打印堆栈中的元素
while (!stack.empty()) {
System.out.println(stack.pop());
}
}
}
应用示例
假设要实现一个简单的计算器,能够计算简单数学表达式(如"3 4 + 2 *",表示先计算3+4,然后将结果乘以2)。使用Stack来处理这类问题非常合适:
import java.util.Stack;
public class SimpleCalculator {
public static int calculate(String expression) {
Stack stack = new Stack<>();
String[] tokens = expression.split(" ");
for (String token : tokens) {
if (token.matches("\\d+")) { // 数字
stack.push(Integer.parseInt(token));
} else if (token.equals("+")) { // 加法
int num2 = stack.pop();
int num1 = stack.pop();
stack.push(num1 + num2);
} else if (token.equals("-")) { // 减法
int num2 = stack.pop();
int num1 = stack.pop();
stack.push(num1 - num2);
} else if (token.equals("*")) { // 乘法
int num2 = stack.pop();
int num1 = stack.pop();
stack.push(num1 * num2);
} else if (token.equals("/")) { // 除法
int num2 = stack.pop();
int num1 = stack.pop();
stack.push(num1 / num2);
}
}
return stack.pop(); // 最终结果在栈顶
}
public static void main(String[] args) {
System.out.println(calculate("3 4 + 2 *")); // 应输出14
}
}
总结
Stack类提供了一种便捷的方式来实现后进先出的数据结构,在解决特定类型的问题时表现出色。然而,随着Java集合框架的发展,可以考虑使用更高效、灵活的替代品,如Deque,来替代传统的Stack类,以获得更好的性能和灵活性。尽管如此,了解Stack的工作原理对于深入理解Java集合框架和数据结构基础依然至关重要。
本文暂时没有评论,来添加一个吧(●'◡'●)