Java中刪除棧中所有偶數元素
從棧中刪除偶數元素在許多現實場景中非常有用。例如,您可以使用此技術從棧中過濾資料。但是,過濾邏輯會根據場景而有所不同。在本例中,我們將刪除偶數並過濾奇數。在其他情況下,您可能需要根據特定條件過濾字串字元,但本教程中解釋的方法適用於所有場景。
問題陳述
給定一個棧,編寫一個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)'。在某些情況下,您可能需要編寫多個條件來過濾棧中的元素。