栈(Stack)是一种基本的线性数据结构,遵循后进先出、先进后出的原则。本文将更详细地介绍栈的概念、特点、Java 实现以及应用场景。
想象一摞叠放的盘子,你只能从最上面取盘子,放盘子也只能放在最上面。栈就像这样一摞盘子,它只有一个开口,称为栈顶 (Top)。另一端封闭,称为栈底 (Bottom)。元素的添加操作称为入栈 (Push),删除操作称为出栈 (Pop)。
栈是一种抽象数据类型 (ADT),这意味着我们只关心它的操作和特性,而不关心具体的实现方式。栈的关键操作包括:
Java 中可以使用数组或链表实现栈。
public class ArrayStack<T> {
private T[] data; // 存储栈元素的数组
private int top; // 栈顶指针,指向栈顶元素的索引,-1 表示栈空
private int capacity; // 栈的容量
public ArrayStack(int capacity) {
this.capacity = capacity;
this.data = (T[]) new Object[capacity]; // 创建泛型数组
this.top = -1;
}
//判空
public boolean isEmpty() {
return top == -1;
}
//判满
public boolean isFull() {
return top == capacity - 1;
}
//入栈操作
public void push(T item) {
if (isFull()) {
// 数组实现需要处理栈满的情况,可以抛出异常或进行扩容
throw new RuntimeException("Stack is full");
// 或者: resizeArray(); // 扩容操作 (此处未实现)
}
data[++top] = item; // 先将 top 指针加 1,再放入元素
}
//出栈操作
public T pop() {
if (isEmpty()) {
throw new RuntimeException("Stack is empty");
}
T item = data[top]; // 获取栈顶元素
data[top--] = null; // 为了避免对象游离,建议将出栈元素置为 null。先获取元素再将 top 指针减 1
return item;
}
//返回栈顶元素
public T peek() {
if (isEmpty()) {
throw new RuntimeException("Stack is empty");
}
return data[top];
}
//返回栈容量
public int size() {
return top + 1;
}
}
public class LinkedListStack<T> {
private Node<T> top; // 指向栈顶节点的指针
private static class Node<T> { // 链表节点的内部类
T data;
Node<T> next;
Node(T data) {
this.data = data;
}
}
public LinkedListStack() {
this.top = null; // 初始化栈为空
}
public boolean isEmpty() {
return top == null;
}
//入栈
public void push(T item) {
Node<T> newNode = new Node<>(item); // 创建新节点
newNode.next = top; // 新节点指向原栈顶
top = newNode; // 更新栈顶指针
}
//出战
public T pop() {
if (isEmpty()) {
throw new RuntimeException("Stack is empty");
}
T data = top.data; // 获取栈顶元素
top = top.next; // 更新栈顶指针
return data;
}
//返回栈顶元素
public T peek() {
if (isEmpty()) {
throw new RuntimeException("Stack is empty");
}
return top.data;
}
}
分别是:元素 a 进栈;元素 b、c 进栈
分别是:元素 c 出栈;b、a 出栈
略,先判断栈是否空,不空直接返回 data[top] 即可。
栈是一种简单但强大的数据结构,其 LIFO 特性使其在许多场景下都非常有用,例如:
理解栈的概念和实现对于程序员来说至关重要,它能帮助我们更好地设计和优化程序。
希望这篇文章能帮助各位看官更好地理解栈这种重要的数据结构! 下期见,谢谢~