【发布时间】:2011-02-22 01:25:03
【问题描述】:
我想编写一个程序来实现一个基于数组的堆栈,它接受用户输入的整数。然后程序将识别用户给定值的任何出现,并从堆栈中删除重复的值,(使用Java 编程语言)。
我只需要你的写作帮助(删除值方法) 例如 输入:6 2 3 4 3 8 输出:6 2 4 8
【问题讨论】:
标签: java arrays stack duplicates
我想编写一个程序来实现一个基于数组的堆栈,它接受用户输入的整数。然后程序将识别用户给定值的任何出现,并从堆栈中删除重复的值,(使用Java 编程语言)。
我只需要你的写作帮助(删除值方法) 例如 输入:6 2 3 4 3 8 输出:6 2 4 8
【问题讨论】:
标签: java arrays stack duplicates
考虑Collection.contains(如果你很不幸,可能与Arrays.asList结合使用)、HashMap或Set。
这真的取决于你拥有什么,你真正要去哪里,以及家庭作业/老师要求的愚蠢限制。既然您说“实现基于数组的堆栈”,我假设有一些愚蠢的要求,在这种情况下,我会考虑编写自定义 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 ...您的代码:-)
【讨论】:
假设“无重复”逻辑是堆栈本身的一部分,我会执行以下操作:
1) 实现一个辅助方法:
private boolean remove(int item)
此方法应该扫描数组,如果找到项目,它应该通过将所有后续项目向后移动一个位置来缩小数组。返回值指示是否发生了删除。
2) 现在很容易实现 push 方法:
public void push(int item) {
if (!remove(item)) {
arr[topPos++] = item;
}
}
请注意,我的解决方案假定数组中始终有足够的空间。适当的实现应该注意在必要时调整数组的大小。
【讨论】:
这个问题是一个有趣(或令人不安)的问题,因为它打破了堆栈的精神来强制执行这样的约束。纯堆栈只能查询其顶部元素。
因此,执行此操作必然需要将堆栈不视为堆栈,而是将其视为某种其他数据结构,或者至少将堆栈中的所有数据传输到不同的中间数据结构。
如果您想从堆栈类本身完成此操作,其他人的回复将证明是有用的。
如果您想从堆栈外部完成此操作,仅使用堆栈接口的传统方法(push() 和 pop()),您的算法可能如下所示:
还有很多其他方法可以做到这一点,但我相信所有方法都需要一些不是堆栈的辅助数据结构。
【讨论】:
覆盖 push 方法并让它在堆栈中运行以确定值是否已经存在。如果是,则返回 false,否则返回 true(如果您想使用布尔返回值)。
基本上,这是 Schneider 先生发布的答案的精神,但是如果您可以确定新项目是否重复,为什么还要缩小数组或修改堆栈呢?如果是重复的,不要添加,数组也不需要修改。我错过了什么吗?
【讨论】: