Java中刪除棧中所有偶數元素


在本教程中,我們將學習如何從包含整數值的給定棧中刪除所有偶數。在Java中,棧是一種基於後進先出 (LIFO) 原則工作的資料結構。這意味著,您最後新增的元素,您可以先獲取它。

從棧中刪除偶數元素在許多現實場景中非常有用。例如,您可以使用此技術從棧中過濾資料。但是,過濾邏輯會根據場景而有所不同。在本例中,我們將刪除偶數並過濾奇數。在其他情況下,您可能需要根據特定條件過濾字串字元,但本教程中解釋的方法適用於所有場景。

問題陳述

給定一個棧,編寫一個Java程式來刪除其中的所有偶數元素。

輸入1

stack = [1, 2, 3, 4, 5]

輸出1

[1, 3, 5]

說明:我們已從棧中刪除了2和4,因為它們是偶數。

輸入2

stack = [1, 7, 3, 11, 9]
輸出2
[1, 7, 3, 11, 9]

說明:棧中沒有偶數。因此,我們不需要刪除任何元素。

不同的方法

在這裡,我們將學習兩種不同的方法來從棧中刪除偶數元素

使用輔助棧

第一種方法使用輔助棧,這意味著使用一個臨時棧來從給定棧中刪除所有偶數。在這種方法中,我們將建立一個臨時棧。之後,我們將遍歷棧的每個元素並從棧中彈出元素。如果彈出的元素為偶數,則將其壓入臨時棧。

在第二次遍歷中,我們將從臨時棧中彈出元素,直到它變空,然後將其再次壓入原始棧。現在,原始棧僅包含奇數。

以下是使用輔助棧刪除棧中所有偶數元素的步驟:

  • java.util包匯入Stack類
  • 初始化一個臨時棧tempStack來儲存奇數元素。
  • 啟動一個迴圈來遍歷原始棧,直到它為空。
  • 從原始棧中彈出頂部元素。
  • 檢查元素是否為奇數(即,element % 2 不等於 0)
  • 如果元素為奇數,則將其壓入tempStack
  • 啟動一個迴圈將元素從tempStack轉移回原始棧。
  • 從tempStack彈出頂部元素並將其壓入原始棧。

示例

以下是上述輔助棧方法的程式碼:

import java.util.Stack;
public class RemoveEvenElements {
    public static void removeEven(Stack stack) {
        Stack tempStack = new Stack<>(); // Create a temporary stack
        // Transfer elements from the original stack to the temporary stack
        while (!stack.isEmpty()) {
            int element = stack.pop();
            if (element % 2 != 0) { // Check if the element is odd
                tempStack.push(element); // Push odd elements to the temporary stack
            }
        }
        // Transfer elements back to the original stack
        while (!tempStack.isEmpty()) {
            stack.push(tempStack.pop());
        }
    }
    public static void main(String[] args) {
        Stack stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        removeEven(stack);
        System.out.println(stack); // Output will be [1, 3, 5]
    }
}

輸出

[1, 3, 5]

時間複雜度:O(n),因為我們遍歷了原始棧。這裡,`n`是棧的大小。在第二次遍歷中,我們遍歷臨時棧,其元素數量小於或等於原始棧。

空間複雜度:O(n),因為我們使用了臨時棧。

使用遞迴

第二種方法遞迴地遍歷棧並刪除偶數元素。讓我們瞭解一下逐步演算法來學習這種方法是如何工作的。

演算法

  • 首先,我們將從java.util包匯入Stack類
  • 檢查棧是否為空。如果棧為空,則從函式中返回(基本情況)
  • 從棧中彈出頂部元素並將其儲存在一個名為element的變數中。
  • 遞迴呼叫removeEven函式來處理其餘的棧。
  • 遞迴呼叫之後,檢查元素是否為奇數(即,element % 2 != 0)。如果元素為奇數,則將其壓回棧中。
  • 遞迴將持續進行,直到所有元素都被處理,刪除偶數並在棧中保留奇數。
  • 遞迴完成後,棧中將只包含奇數元素,其順序與最初放置的順序相同。

示例

以下是上述方法的程式碼:

import java.util.Stack;
public class RemoveEvenElements {
    public static void removeEven(Stack stack) {
        if (stack.isEmpty()) {
            return; // Base case: stack is empty
        }
        int element = stack.pop(); // Pop the top element
        removeEven(stack); // Recursive call to process the rest of the stack
        if (element % 2 != 0) { // Check if the element is odd
            stack.push(element); // Push odd elements back into the stack
        }
    }
    public static void main(String[] args) {
        Stack stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        removeEven(stack);
        System.out.println(stack); // Output will be [1, 3, 5]
    }
}

輸出

[1, 3, 5]

時間複雜度:O(n),因為我們遞迴地遍歷了原始棧。這裡,`n`是棧的大小。
空間複雜度:O(n)。它用於遞迴棧。

結論

在本教程中,我們學習了兩種不同的方法來從棧中刪除偶數。第一種方法對於初學者來說很容易理解。使用類似的程式碼,您可以對棧執行不同型別的過濾操作。例如,要從棧中刪除奇數,您只需要將'if (element % 2 != 0)'條件更改為'if (element % 2 == 0)'。在某些情況下,您可能需要編寫多個條件來過濾棧中的元素。

Shubham B Vora
Shubham B Vora

專家技術內容撰寫人 | 專注於技術、人工智慧和程式設計 | 幫助品牌有效溝通

更新於:2024年9月23日

3000+ 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告