【问题标题】:remove repeated vaules _stack&array删除重复值 _stack&array
【发布时间】:2011-02-22 01:25:03
【问题描述】:

我想编写一个程序来实现一个基于数组的堆栈,它接受用户输入的整数。然后程序将识别用户给定值的任何出现,并从堆栈中删除重复的值,(使用Java 编程语言)。

我只需要你的写作帮助(删除值方法) 例如 输入:6 2 3 4 3 8 输出:6 2 4 8

【问题讨论】:

    标签: java arrays stack duplicates


    【解决方案1】:

    考虑Collection.contains(如果你很不幸,可能与Arrays.asList结合使用)、HashMapSet

    这真的取决于你拥有什么,你真正要去哪里,以及家庭作业/老师要求的愚蠢限制。既然您说“实现基于数组的堆栈”,我假设有一些愚蠢的要求,在这种情况下,我会考虑编写自定义 arrayContains helper* 方法和/或使用辅助数据结构(哈希/集)来保持'看见'的轨迹。

    如果您在插入时进行检查,它只是(元代码,这是您的家庭作业:-):

    function addItem (i) begin
       if not contains(stack, i) then
          push(stack, i)
       end if
    end
    

    *如果你不介意“效率不高”,你可以使用上面的 asList/contains,但是 Java 对数组的支持非常少,因此建议使用 helper,而这反过来只是一个循环如果找到值,则数组返回 true,否则返回 false。 (或者,也许返回找到的索引或-1 ...您的代码:-)

    【讨论】:

      【解决方案2】:

      假设“无重复”逻辑是堆栈本身的一部分,我会执行以下操作:

      1) 实现一个辅助方法:

      private boolean remove(int item)
      

      此方法应该扫描数组,如果找到项目,它应该通过将所有后续项目向后移动一个位置来缩小数组。返回值指示是否发生了删除。

      2) 现在很容易实现 push 方法:

      public void push(int item) {
          if (!remove(item)) {
              arr[topPos++] = item;
          }
      }
      

      请注意,我的解决方案假定数组中始终有足够的空间。适当的实现应该注意在必要时调整数组的大小。

      【讨论】:

        【解决方案3】:

        这个问题是一个有趣(或令人不安)的问题,因为它打破了堆栈的精神来强制执行这样的约束。纯堆栈只能查询其顶部元素。

        因此,执行此操作必然需要将堆栈不视为堆栈,而是将其视为某种其他数据结构,或者至少将堆栈中的所有数据传输到不同的中间数据结构。

        如果您想从堆栈类本身完成此操作,其他人的回复将证明是有用的。

        如果您想从堆栈外部完成此操作,仅使用堆栈接口的传统方法(push() 和 pop()),您的算法可能如下所示:

        1. 创建一组整数来跟踪迄今为止遇到的值。
        2. 创建第二个堆栈以临时保存这些值。
        3. 虽然堆栈不是空的,
          1. 弹出顶部元素。
          2. 如果集合尚不包含该元素,请将其添加到集合中并将其推送到第二个堆栈中。
          3. 如果集合中确实包含该元素,则意味着您已经遇到过它并且这是重复的。所以忽略它。
        4. 虽然第二个堆栈不是空的,
          1. 弹出顶部元素
          2. 将元素推回原始堆栈。

        还有很多其他方法可以做到这一点,但我相信所有方法都需要一些不是堆栈的辅助数据结构。

        【讨论】:

          【解决方案4】:

          覆盖 push 方法并让它在堆栈中运行以确定值是否已经存在。如果是,则返回 false,否则返回 true(如果您想使用布尔返回值)。

          基本上,这是 Schneider 先生发布的答案的精神,但是如果您可以确定新项目是否重复,为什么还要缩小数组或修改堆栈呢?如果是重复的,不要添加,数组也不需要修改。我错过了什么吗?

          【讨论】:

            猜你喜欢
            • 2013-12-10
            • 1970-01-01
            • 1970-01-01
            • 2022-01-23
            • 2015-02-28
            • 1970-01-01
            • 2016-11-25
            相关资源
            最近更新 更多