我想编写一个程序来实现一个基于数组的堆栈,它接受用户输入的整数。然后程序将识别用户给定值的任何出现并从堆栈中删除重复的值(使用Java编程语言)。
我只需要你的写作帮助(删除值方法) 例如 输入:6 2 3 4 3 8 输出:6 2 4 8
答案 0 :(得分:0)
考虑Collection.contains(可能与Arrays.asList一起,如果您非常不幸),HashMap或Set。
这取决于你拥有什么,你真正去哪里,以及家庭作业/教师要求的愚蠢限制。既然你说“实现基于数组的堆栈”,我假设有一些愚蠢的命令,在这种情况下,我会考虑编写自定义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()),您的算法可能如下所示:
还有其他各种方法可以做到这一点,但我相信所有这些都需要一些不是堆栈的辅助数据结构。
答案 3 :(得分:0)
重写push方法并使其在堆栈中运行以确定该值是否已存在。如果是这样,则返回false,否则为true(如果你想使用布尔返回值)。
基本上,这是Schneider先生发布的答案的精神,但是如果你能确定一个新项目是否重复,为什么要缩小数组或修改堆栈呢?如果它是重复的,请不要添加它,并且不需要修改数组。我错过了什么吗?