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+ 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告