删除重复值_stack&数组

时间:2010-05-20 19:33:48

标签: java arrays stack duplicates

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

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

4 个答案:

答案 0 :(得分:0)

考虑Collection.contains(可能与Arrays.asList一起,如果您非常不幸),HashMapSet

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

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

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

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

答案 1 :(得分:0)

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

1)实现一个辅助方法:

private boolean remove(int item)

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

2)现在很容易实现推送方法:

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

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

答案 2 :(得分:0)

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

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

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

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

  1. 创建一组整数以跟踪到目前为止遇到的值。
  2. 创建第二个堆栈以暂时保存值。
  3. 虽然堆栈不是空的,
    1. 弹出顶部元素。
    2. 如果该集合尚未包含该元素,请将其添加到集合中并将其推送到第二个堆栈。
    3. 如果该集合确实包含该元素,则表示您已经遇到过该元素,这是重复的。所以忽略它。
  4. 虽然第二个堆栈不是空的,
    1. 弹出顶部元素
    2. 将元素推回原始堆栈。
  5. 还有其他各种方法可以做到这一点,但我相信所有这些都需要一些不是堆栈的辅助数据结构。

答案 3 :(得分:0)

重写push方法并使其在堆栈中运行以确定该值是否已存在。如果是这样,则返回false,否则为true(如果你想使用布尔返回值)。

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