Stack学习-Java快速进阶教程
栈是按后进先出 (LIFO) 顺序存储的元素的集合。换句话说,栈是一种以后进先出的方式存储数据的数据结构。
这意味着作为最后一个元素存储到栈中的元素将是第一个从栈中删除的元素。在给定时间,只有栈上的顶部元素可以访问。
当元素(对象)插入栈时,称为推送操作。我们可以创建任何类型的元素的栈。
当元素从栈中删除时,它被称为弹出操作。
在栈中搜索元素时,称为操作。
元素的插入和删除仅从栈的一侧(传统上称为栈顶部)进行。也就是说,新元素被添加到栈的顶部,元素从栈的顶部删除。
因此,栈称为后进先出数据结构。下图显示了 java 中栈的典型示例。
如上图所示,我们在栈中添加了三个元素 A、B 和 C。当它们从栈中删除时,我们获得元素 C、B 和 A 时尚。这种方式称为后进先出数据结构。
栈类是在Java 1.0版本中引入的。它存在于java.util.Stack<E>包中。这个类现在被认为是 Java 中的遗留类,因为它与 Java Collections Framework 不一致。因此建议大家使用新的Java ArrayDeque 类。ArrayDeque提供了栈的所有正常功能,并且与JCF一致。
Java Stack 类的层次结构
Java Stack 类扩展了扩展 AbstractList 类的向量类。它实现了列表接口和随机访问接口。栈类还实现了可序列化和可克隆接口。
java 中栈的层次结构图如下图所示。
栈类声明
Stack 是 java 中的一个泛型类,它以通用形式具有以下声明:
public class Stack<E> extends Vector<E>
在这里,E 表示栈可以容纳的元素类型。
栈类的功能
Java 中的栈有几个特性,如下所示:
1. 栈具有“后进先出”检索的元素的能力。
2. 在 Java 栈中,所有操作都发生在栈的顶部。
3. 推送操作将元素插入栈顶部。
4. 弹出操作从栈中删除元素并返回它。
5. 栈类同步。这意味着它是线程安全的。
6. 允许空元素进入栈。
7. 允许重复元素进入栈。
Java 中栈类的构造函数
栈类仅提供了一个构造函数,如下所示:
1. Stack():此构造函数用于创建一个空的栈对象。创建栈对象的一般形式如下:
Stack<E> stack = new Stack<E>(); For example: Stack<Integer> stack = new Stack<Integer>(); // It will store only Integer type objects.
Java 中的栈方法
除了从向量类继承的方法之外,栈类还有五个自己的其他方法。它们如下:
1. 布尔值 empty():此方法用于检查栈是否为空。当且仅当栈不包含元素(对象)时,它才返回 true。否则,它将返回 false。
2. E peek():此方法用于从栈中检索最顶层的元素而不删除它。
3. E pop():pop() 方法用于从栈中弹出(删除)最顶层的元素并返回它。
4. E push(E obj):此方法将元素 obj 推送到栈顶部并返回该元素(对象)。
5. int search(Object obj):此方法从栈顶部返回元素 obj 的位置。如果栈中不存在该元素,则返回 -1。
Java 栈示例程序
让我们举一些示例程序来执行基于 java 中的栈类方法的各种操作。
1. 添加元素:使用 push() 方法,我们可以将元素添加到栈中。push() 方法将元素放在栈的顶部。
程序源代码 1:
import java.util.Stack; public class StackEx { public static void main(String[] args) { // Create an empty stack that contains String objects. Stack<String> st = new Stack<>(); // Checks that stack is empty or not. boolean empty = st.empty(); System.out.println("Is stack empty: " +empty); // Adds elements to the top of stack using push() method. st.push("Sunday"); st.push("Monday"); st.push("Tuesday"); st.push("Wednesday"); st.push("Thursday"); st.push("Friday"); st.push("Saturday"); // Displaying elements from the stack. System.out.println("Elements of Stack: " +st); } }
Output: Is stack empty: true Elements of Stack: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
2. 访问元素:使用 peek() 方法,我们可以在不删除堆栈顶部检索或获取元素。我们还将使用 search() 方法将元素的位置拖到堆栈中。
查看下面的源代码。
import java.util.Stack; public class StackEx2 { public static void main(String[] args) { // Create an empty stack that contains Integer objects. Stack<Integer> st = new Stack<>(); st.push(25); st.push(30); st.push(35); st.push(40); st.push(45); st.push(50); // Displaying elements from the stack. System.out.println("Elements of Stack: " +st); // Retrieving element at the top of stack. Object peekElement = st.peek(); System.out.println("Element at the top of stack: " +peekElement); // Find the position of element into the stack. System.out.println("Position of element 50: " +st.search(50)); System.out.println("Position of element 80: " +st.search(80)); } }
Output: Elements of Stack: [25, 30, 35, 40, 45, 50] Element at the top of stack: 50 Position of element 50: 1 Position of element 80: -1
3. 删除元素:使用 pop() 方法,我们可以从 java 的堆栈中弹出一个元素。
程序源代码 3:
import java.util.Stack; public class StackEx3 { public static void main(String[] args) { // Create an empty stack that contains Integer objects. Stack<Integer> st = new Stack<>(); st.push(25); st.push(30); st.push(35); st.push(40); st.push(45); st.push(50); // Displaying elements from the stack. System.out.println("Elements of Stack: " +st); // Removing elements from the stack one by one. while(st.size() > 0){ System.out.println("Removed element: " +st.pop()); } System.out.println("Is stack empty: " +st.empty()); } }
Output: Elements of Stack: [25, 30, 35, 40, 45, 50] Removed element: 50 Removed element: 45 Removed element: 40 Removed element: 35 Removed element: 30 Removed element: 25 Is stack empty: true
程序源代码 4:
import java.util.Stack; public class StackEx4 { public static void main(String[] args) { Stack<Integer> st = new Stack<>(); st.push(25); st.push(30); st.push(35); st.push(40); st.push(45); System.out.println("Original elements of stack: " +st); System.out.println("Pop element: " +st.pop()); System.out.println("Elements of stack after removing: " +st); System.out.println("Push element: " +st.push(50)); System.out.println("Elements of stack after adding: " +st); } }
Output: Original elements of stack: [25, 30, 35, 40, 45] Pop element: 45 Elements of stack after removing: [25, 30, 35, 40] Push element: 50 Elements of stack after adding: [25, 30, 35, 40, 50]
解释:
查看上图可以更清楚地了解 java 栈中的推送和弹出操作。