2

我正在尝试删除堆栈中的特定元素,但遇到了一些麻烦。我的想法是将元素弹出到临时堆栈中,弹出我要查找的索引,然后将临时堆栈中的元素弹出回主堆栈。我很难想出如何让临时堆栈重新回到顶部。任何帮助将不胜感激。

public E remove(int index) {
    Stack<E> tmpStack = new Stack<E>();
    if (size() == 0) {
        return null;
    } else {
        for (int i = 0; i < index; i++) {
            tmpStack.push(this.pop());
        }
        return tmpStack.pop();
    }
    while (!tmpStack.isEmpty())
        this.push(tmpStack.pop());
}

想法?干杯!

4

2 回答 2

3

问题是您在最后一次还原操作之前有一个返回,因此方法返回删除的元素而不调用它之后的代码。

您通常会遇到无法访问的代码错误,但在您的情况下,情况并非如此,因为您没有将最后一个while包含在else分支内,因此如果堆栈为空,while则执行(即使在空堆栈上)并且 java 编译器无法检测到这个。

你应该做类似的事情:

if (isEmpty())
  return null;
else
{
  for (int i = 0; i < index; i++)
    tmpStack.push(this.pop());

  E removedElement = tmpStack.pop();

  while (!tmpStack.isEmpty())
    this.push(tmpStack.pop());

  return removedElement;
}
于 2013-10-29T00:49:14.850 回答
1

访问堆栈中特定索引处的元素与拥有堆栈的观点背道而驰。其他考虑因素包括索引是否从堆栈的最顶部引用。正如其他人所提到的,问题是您在将元素放回原始堆栈之前返回。您还应该考虑索引大于堆栈当前大小的情况,因为您当前的实现会导致错误。(JavaStack会抛出一个EmptyStackException

于 2013-10-29T00:53:56.590 回答