Java 集合框架提供一个 Stack 类,该类建模并实现栈数据结构。该类基于后进先出的基本原则。除了基本的入栈和出栈操作外,该类还提供了清空、搜索和查看三个函数。该类也可以说是对 Vector 的扩展,并将该类视为具有上述五个函数的堆栈。该类也可以称为 Vector 的子类。
下图显示了Stack类的层次结构:
类支持一默认构造函数 Stack()这是用来创建一个空堆栈。
声明:
public class Stack<E> extends Vector<E>
所有实现的接口:
- 可序列化:它是类要进行序列化和反序列化时必须实现的标记接口。
- 可克隆:这是Java中的一个接口,需要由类实现以允许克隆其对象。
- 可迭代<E>:该接口表示可迭代的对象集合——意味着可以迭代。
- 集合<E>:集合表示一组称为其元素的对象。 Collection 接口用于传递需要最大通用性的对象集合。
- List InterfaceList 接口提供了一种存储有序集合的方法。它是 Collection 的子接口。
- 随机访问:这是 List 实现使用的标记接口,用于指示它们支持快速(通常是恒定时间)随机访问。
如何创建堆栈?
为了创建堆栈,我们必须导入java.util.stack打包并使用该类的Stack()构造函数。下面的示例创建一个空堆栈。
Stack<E> stack = new Stack<E>();
这里E是Object的类型。
例子:
Java
// Java code for stack implementation
import java.io.*;
import java.util.*;
class Test
{
// Pushing element on the top of the stack
static void stack_push(Stack<Integer> stack)
{
for(int i = 0; i < 5; i++)
{
stack.push(i);
}
}
// Popping element from the top of the stack
static void stack_pop(Stack<Integer> stack)
{
System.out.println("Pop Operation:");
for(int i = 0; i < 5; i++)
{
Integer y = (Integer) stack.pop();
System.out.println(y);
}
}
// Displaying element on the top of the stack
static void stack_peek(Stack<Integer> stack)
{
Integer element = (Integer) stack.peek();
System.out.println("Element on stack top: " + element);
}
// Searching element in the stack
static void stack_search(Stack<Integer> stack, int element)
{
Integer pos = (Integer) stack.search(element);
if(pos == -1)
System.out.println("Element not found");
else
System.out.println("Element is found at position: " + pos);
}
public static void main (String[] args)
{
Stack<Integer> stack = new Stack<Integer>();
stack_push(stack);
stack_pop(stack);
stack_push(stack);
stack_peek(stack);
stack_search(stack, 2);
stack_search(stack, 6);
}
}
输出:
Pop Operation:
4
3
2
1
0
Element on stack top: 4
Element is found at position: 3
Element not found
对 Stack 类执行各种操作
1. 添加元素:为了将元素添加到堆栈中,我们可以使用push()方法.这Stack push()操作将元素置于栈顶。
Java
// Java program to add the
// elements in the stack
import java.io.*;
import java.util.*;
class StackDemo {
// Main Method
public static void main(String[] args)
{
// Default initialization of Stack
Stack stack1 = new Stack();
// Initialization of Stack
// using Generics
Stack<String> stack2 = new Stack<String>();
// pushing the elements
stack1.push("4");
stack1.push("All");
stack1.push("Geeks");
stack2.push("Geeks");
stack2.push("For");
stack2.push("Geeks");
// Printing the Stack Elements
System.out.println(stack1);
System.out.println(stack2);
}
}
输出:
[4, All, Geeks]
[Geeks, For, Geeks]
2. 访问元素:要检索或获取堆栈的第一个元素或堆栈顶部的元素,我们可以使用Stack peek()方法。检索到的元素不会被删除或从堆栈中移除。
Java
// Java program to demonstrate the accessing
// of the elements from the stack
import java.util.*;
import java.io.*;
public class StackDemo {
// Main Method
public static void main(String args[])
{
// Creating an empty Stack
Stack<String> stack = new Stack<String>();
// Use push() to add elements into the Stack
stack.push("Welcome");
stack.push("To");
stack.push("Geeks");
stack.push("For");
stack.push("Geeks");
// Displaying the Stack
System.out.println("Initial Stack: " + stack);
// Fetching the element at the head of the Stack
System.out.println("The element at the top of the"
+ " stack is: " + stack.peek());
// Displaying the Stack after the Operation
System.out.println("Final Stack: " + stack);
}
}
输出:
Initial Stack: [Welcome, To, Geeks, For, Geeks]
The element at the top of the stack is: Geeks
Final Stack: [Welcome, To, Geeks, For, Geeks]
3. 删除元素:要从堆栈中弹出一个元素,我们可以使用Stack pop()方法。该元素从堆栈顶部弹出并从堆栈中删除。
Java
// Java program to demonstrate the removing
// of the elements from the stack
import java.util.*;
import java.io.*;
public class StackDemo {
public static void main(String args[])
{
// Creating an empty Stack
Stack<Integer> stack = new Stack<Integer>();
// Use add() method to add elements
stack.push(10);
stack.push(15);
stack.push(30);
stack.push(20);
stack.push(5);
// Displaying the Stack
System.out.println("Initial Stack: " + stack);
// Removing elements using pop() method
System.out.println("Popped element: "
+ stack.pop());
System.out.println("Popped element: "
+ stack.pop());
// Displaying the Stack after pop operation
System.out.println("Stack after pop operation "
+ stack);
}
}
输出:
Initial Stack: [10, 15, 30, 20, 5]
Popped element: 5
Popped element: 20
Stack after pop operation [10, 15, 30]
示例
在 Java 中,Stack 类是 Vector 类的子类,表示对象的后进先出 (LIFO) 堆栈。它扩展了 Vector 类,以便轻松实现堆栈数据结构。
以下是如何在 Java 中使用 Stack 类的示例:
Java
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
// Create a new stack
Stack<Integer> stack = new Stack<>();
// Push elements onto the stack
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
// Pop elements from the stack
while(!stack.isEmpty()) {
System.out.println(stack.pop());
}
}
}
4 3 2 1
在此示例中,我们首先从 java.util 包中导入 Stack 类。然后,我们使用默认构造函数创建一个名为 stack 的新 Stack 对象。我们使用 push() 方法将四个整数压入堆栈。然后,我们在 while 循环内使用 pop() 方法从堆栈中弹出元素。 isEmpty() 方法用于在尝试弹出元素之前检查堆栈是否为空。
此代码创建一个整数堆栈,并按 1 -> 2 -> 3 -> 4 的顺序将 4 个整数压入堆栈。然后,我们使用 pop() 方法从堆栈中逐个弹出元素,该方法会删除并返回栈顶元素。由于堆栈遵循后进先出 (LIFO) 顺序,因此会以与插入相反的顺序弹出元素,从而产生如上所示的输出。
Stack 类提供了其他几种操作堆栈的方法,例如 peek() 检索顶部元素而不删除它,search() 搜索堆栈中的元素并返回其位置,以及 size() 返回当前元素堆栈的大小。 Stack 类还提供了几个构造函数,用于创建具有指定初始容量的堆栈或通过复制现有堆栈。
堆栈类中的方法
METHOD |
DESCRIPTION |
---|---|
如果堆栈顶部没有任何内容,则返回 true。否则,返回 false。 |
|
返回栈顶元素,但不删除它。 |
|
移除并返回栈顶元素。 “EmptyStackException” 如果我们在调用堆栈为空时调用pop(),则会引发异常。 |
|
将一个元素压入栈顶。 |
|
它判断堆栈中是否存在对象。如果找到该元素, 它从堆栈顶部返回元素的位置。否则,返回-1。 |
从类 java.util.Vector 继承的方法
METHOD |
DESCRIPTION |
---|---|
Vector add() | 将指定元素追加到此 Vector 的末尾。 |
Vector add() | 在此 Vector 中的指定位置插入指定元素。 |
Vector addAll() |
将指定 Collection 中的所有元素追加到此 Vector 的末尾, 按照指定集合的迭代器返回它们的顺序。 |
Vector addAll() | 将指定 Collection 中的所有元素插入此 Vector 的指定位置。 |
Vector addElement() | 将指定的组件添加到此向量的末尾,将其大小增加一。 |
Vector capacity() | 返回该向量的当前容量。 |
Vector clear() | 从此向量中删除所有元素。 |
Vector clone() | 返回此向量的克隆。 |
Vector contains() | 如果此向量包含指定元素,则返回 true。 |
Vector containsAll() | 如果此 Vector 包含指定 Collection 中的所有元素,则返回 true。 |
Vector copyInto() | 将此向量的分量复制到指定的数组中。 |
Vector elementAt() | 返回指定索引处的组件。 |
Vector elements() | 返回此向量的分量的枚举。 |
Vector ensureCapacity() |
如有必要,增加此向量的容量,以确保它可以容纳 至少由最小容量参数指定的组件数量。 |
Vector equals() | 比较指定的 Object 与此 Vector 是否相等。 |
Vector firstElement() | 返回该向量的第一个分量(索引 0 处的项)。 |
Vector get() | 返回此 Vector 中指定位置的元素。 |
Vector hashCode() | 返回此 Vector 的哈希码值。 |
Vector indexOf() |
返回指定元素在此向量中第一次出现的索引,或 -1 如果该向量不包含该元素。 |
Vector indexOf() | 返回指定元素在此向量中第一次出现的索引,从该索引向前搜索,如果未找到该元素,则返回 -1。 |
Vector insertElementAt() | 将指定对象作为组件插入此向量中的指定索引处。 |
Vector isEmpty() | 测试该向量是否没有分量。 |
Vector iterator() | 按正确顺序返回此列表中元素的迭代器。 |
Vector lastElement() | 返回向量的最后一个分量。 |
Vector lastIndexOf() |
返回此向量中最后一次出现的指定元素的索引,或 -1 如果该向量不包含该元素。 |
Vector lastIndexOf() |
返回此向量中最后一次出现的指定元素的索引, 从索引向后搜索,如果未找到该元素,则返回 -1。 |
Vector listIterator() | 返回此列表中元素的列表迭代器(按正确的顺序)。 |
Vector listIterator() |
返回列表中元素的列表迭代器(按正确的顺序), 从列表中的指定位置开始。 |
Vector remove() | 删除此 Vector 中指定位置的元素。 |
Vector remove() | 删除此 Vector 中第一次出现的指定元素。如果 Vector 不包含该元素,则该元素保持不变。 |
Vector removeAll() | 从此 Vector 中删除指定 Collection 中包含的所有元素。 |
Vector removeAllElements() | 从此向量中删除所有组件并将其大小设置为零。 |
Vector removeElement() | 从此向量中删除第一个 (lowest-indexed) 出现的参数。 |
Vector removeElementAt() | 删除指定索引处的组件。 |
Vector removeRange() | 从此列表中删除索引介于 fromIndex(包含)和 toIndex(不包含)之间的所有元素。 |
Vector retainAll() | 仅保留此 Vector 中包含在指定 Collection 中的元素。 |
Vector set() | 将此 Vector 中指定位置的元素替换为指定元素。 |
Vector setElementAt() | 将此向量的指定索引处的组件设置为指定对象。 |
Vector setSize() | 设置该向量的大小。 |
Vector size() | 返回此向量中的分量数。 |
Vector subList() | 返回此列表中介于 fromIndex(包含)和 toIndex(不包含)之间的部分的视图。 |
Vector toArray() | 返回一个数组,其中按正确顺序包含此 Vector 中的所有元素。 |
Vector toArray() |
返回一个数组,其中按正确顺序包含此 Vector 中的所有元素;运行时 返回数组的类型是指定数组的类型。 |
Vector toString() | 返回此 Vector 的字符串表示形式,其中包含每个元素的字符串表示形式。 |
Vector trimToSize() | 将此向量的容量修剪为向量的当前大小。 |
优先使用双端队列堆栈之上 -:
Java中的Stack类是一个遗留类,继承自Vector。它是一个线程安全的类,因此当我们不需要线程安全时会产生开销。推荐使用ArrayDeque 用于堆栈实现,因为它在单线程环境中更有效。
Java
// A Java Program to show implementation
// of Stack using ArrayDeque
import java.util.*;
class GFG {
public static void main (String[] args) {
Deque<Character> stack = new ArrayDeque<Character>();
stack.push('A');
stack.push('B');
System.out.println(stack.peek());
System.out.println(stack.pop());
}
}
输出:
B
B
使用 Deque 而不是 Stack 的另一个原因是 Deque 能够使用流转换为列表并保持 LIFO 概念的应用,而 Stack 则不能。
Java
import java.util.*;
import java.util.stream.Collectors;
class GFG {
public static void main (String[] args) {
Stack<Integer> stack = new Stack<>();
Deque<Integer> deque = new ArrayDeque<>();
stack.push(1);//1 is the top
deque.push(1);//1 is the top
stack.push(2);//2 is the top
deque.push(2);//2 is the top
List<Integer> list1 = stack.stream().collect(Collectors.toList());//[1,2]
System.out.println("Using Stack -");
for(int i = 0; i < list1.size(); i++){
System.out.print(list1.get(i) + " " );
}
System.out.println();
List<Integer> list2 = deque.stream().collect(Collectors.toList());//[2,1]
System.out.println("Using Deque -");
for(int i = 0; i < list2.size(); i++){
System.out.print(list2.get(i) + " " );
}
System.out.println();
}
}
Using Stack - 1 2 Using Deque - 2 1
相关用法
- Java StackTraceElement.getClassName()用法及代码示例
- Java StackTraceElement.getFileName()用法及代码示例
- Java StackTraceElement.getLineNumber()用法及代码示例
- Java StackTraceElement.getMethodName()用法及代码示例
- Java StackTraceElement.isNativeMethod()用法及代码示例
- Java StackTraceElement equals()用法及代码示例
- Java StackTraceElement getClassName()用法及代码示例
- Java StackTraceElement hashCode()用法及代码示例
- Java StackTraceElement isNativeMethod()用法及代码示例
- Java StackTraceElement toString()用法及代码示例
- Java Stack addAll(Collection)用法及代码示例
- Java Stack addElement(E)用法及代码示例
- Java Stack add(Object)用法及代码示例
- Java Stack capacity()用法及代码示例
- Java Stack clear()用法及代码示例
- Java Stack clone()用法及代码示例
- Java Stack contains()用法及代码示例
- Java Stack containsAll()用法及代码示例
- Java Stack copyInto()用法及代码示例
- Java Stack elementAt()用法及代码示例
- Java Stack elements()用法及代码示例
- Java Stack empty()用法及代码示例
- Java Stack ensureCapacity()用法及代码示例
- Java Stack equals()用法及代码示例
- Java Stack firstElement()用法及代码示例
注:本文由纯净天空筛选整理自佚名大神的英文原创作品 Stack Class in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。