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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。