當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java Stack用法及代碼示例


Java 集合框架提供一個 Stack 類,該類建模並實現棧數據結構。該類基於後進先出的基本原則。除了基本的入棧和出棧操作外,該類還提供了清空、搜索和查看三個函數。該類也可以說是對 Vector 的擴展,並將該類視為具有上述五個函數的堆棧。該類也可以稱為 Vector 的子類。

下圖顯示了Stack類的層次結構:

Stack Class in Java

類支持一默認構造函數 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

Stack empty()

如果堆棧頂部沒有任何內容,則返回 true。否則,返回 false。

Stack peek()

返回棧頂元素,但不刪除它。

Stack pop()

移除並返回棧頂元素。 “EmptyStackException”

如果我們在調用堆棧為空時調用pop(),則會引發異常。

Stack push()

將一個元素壓入棧頂。

Stack search()

它判斷堆棧中是否存在對象。如果找到該元素,

它從堆棧頂部返回元素的位置。否則,返回-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 



相關用法


注:本文由純淨天空篩選整理自佚名大神的英文原創作品 Stack Class in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。