1. 栈与队列的基础认知
在计算机科学中,栈和队列是两种最基础也最重要的数据结构。它们就像我们生活中的两种容器:栈类似于羽毛球筒——最后放进去的羽毛球会最先被取出(LIFO原则);而队列则像排队买奶茶的队伍——先来的人先被服务(FIFO原则)。这两种数据结构在算法实现、系统设计、编译器构建等场景中无处不在。
Java作为一门面向对象的语言,其集合框架中虽然提供了Stack类和Queue接口,但理解它们的底层实现原理对开发者至关重要。比如Android系统的Activity回退栈、消息队列机制,或是电商系统中的订单处理队列,本质上都是这两种数据结构的应用体现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 栈的Java实现详解
2.1 基于数组的栈实现
数组实现栈是最直观的方式,我们需要维护一个top指针来跟踪栈顶位置。初始化时创建一个固定大小的数组,push操作时元素被添加到数组末尾并移动top指针,pop操作则返回top指向的元素并下移指针。
java复制public class ArrayStack {
private int maxSize;
private int[] stack;
private int top = -1;
public ArrayStack(int size) {
this.maxSize = size;
stack = new int[maxSize];
}
public boolean isFull() {
return top == maxSize - 1;
}
public boolean isEmpty() {
return top == -1;
}
public void push(int value) {
if(isFull()) {
throw new RuntimeException("栈已满");
}
stack[++top] = value;
}
public int pop() {
if(isEmpty()) {
throw new RuntimeException("栈为空");
}
return stack[top--];
}
public int peek() {
if(isEmpty()) {
throw new RuntimeException("栈为空");
}
return stack[top];
}
}
关键细节:数组实现需要考虑边界条件,特别是栈满和栈空时的异常处理。实际工程中建议使用动态扩容策略替代固定大小数组。
2.2 基于链表的栈实现
链表实现的栈更加灵活
