Stack-概述
栈(Stack)是计算机科学中一种经典的数据结构,它遵循后进先出(Last In, First Out, LIFO)的原则。
这意味着最后进入栈的元素最先被移除。
栈通常支持两种基本操作:压入(push)和弹出(pop)。
栈的基本操作:
-
压入(Push):将一个元素添加到栈的顶部。如果栈为空,则该元素成为栈的底部元素。
-
弹出(Pop):从栈的顶部移除一个元素,并返回该元素的值。如果栈为空,则弹出操作会导致栈为空。
栈的特性:
-
后进先出(LIFO):最后压入栈的元素最先被弹出,类比于将物体堆放在一起,后放入的物体必须先取出才能获取到。
-
顶部访问(Top):栈允许对顶部元素进行访问或操作,而不影响其它元素。
JAVA实现栈
1. ArrayDeque
-
ArrayDeque 是一个双端队列(deque)的实现,它可以在队列的两端进行元素的插入和删除操作。
-
由于栈是一种只能在一端进行插入和删除的数据结构,因此可以使用 ArrayDeque 的一端来模拟栈的行为。
具体实现方式如下:
- 使用 ArrayDeque 创建一个空的双端队列对象:
ArrayDeque<String> stack = new ArrayDeque<>();
- 使用
push()
方法将元素压入队列的一端,即栈顶部的位置:stack.push("Java");
- 使用
pop()
方法从队列的一端移除并返回栈顶部的元素:String topElement = stack.pop();
- 使用
peek()
方法返回但不移除栈顶部的元素:String topElement = stack.peek();
- 使用
isEmpty()
方法检查队列是否为空:boolean isEmpty = stack.isEmpty();
在 ArrayDeque 中,元素的插入和删除操作都是在同一端进行的,这样就满足了栈的后进先出(LIFO)的特性。
import java.util.ArrayDeque;
public class Main {
public static void main(String[] args) {
ArrayDeque<String> stack = new ArrayDeque<>();
// 压入元素
stack.push("Java");
stack.push("Python");
stack.push("C++");
// 弹出并打印元素
while (!stack.isEmpty()) {
System.out.println(stack.pop());
}
}
}
2. LinkedList
- LinkedList 是 Java 集合框架中的一种双向链表实现, 也可以被用作栈的实现方式,其原理与 ArrayDeque 类似,只需要在链表的头部进行元素的插入和删除操作即可。
- 使用 LinkedList 创建一个空链表对象:
LinkedList<String> stack = new LinkedList<>();
- 使用
push()
方法将元素插入链表的头部,即栈顶部的位置:stack.push("Java");
- 使用
pop()
方法从链表的头部移除并返回栈顶部的元素:String topElement = stack.pop();
- 使用
peek()
方法返回但不移除栈顶部的元素:String topElement = stack.peek();
- 使用
isEmpty()
方法检查链表是否为空:boolean isEmpty = stack.isEmpty();
-
在 LinkedList 中,元素的插入和删除操作都是在链表的头部进行的,这样就满足了栈的后进先出(LIFO)的特性。
import java.util.LinkedList; public class Main { public static void main(String[] args) { LinkedList<String> stack = new LinkedList<>(); // 压入元素 stack.push("Java"); stack.push("Python"); stack.push("C++"); // 弹出并打印元素 while (!stack.isEmpty()) { System.out.println(stack.pop()); } } }
3. 数组实现
-
数组也可以用来实现栈,使用一个数组来存储栈元素,同时记录一个指向栈顶的指针。
-
在入栈和出栈操作时,更新指针位置即可。
public class Stack { int[] data; int top; public Stack(int size) { data = new int[size]; top = -1; } public void push(int value) { if (top == data.length - 1) { System.out.println("Stack is full"); return; } data[++top] = value; } public int pop() { if (top < 0) { System.out.println("Stack is empty"); return -1; } return data[top--]; } public boolean isEmpty() { return top < 0; } public static void main(String[] args) { Stack stack = new Stack(3); // 压入元素 stack.push(1); stack.push(2); stack.push(3); // 弹出并打印元素 while (!stack.isEmpty()) { System.out.println(stack.pop()); } } }