当前位置: 首页 > 知识库问答 >
问题:

移除堆栈中的特定元素

唐彬炳
2023-03-14

我试图删除堆栈中的特定元素,但遇到了一些问题。我的想法是将元素弹出到一个临时堆栈中,弹出我正在寻找的索引,然后将临时堆栈中的元素弹出到主堆栈中。我很难想象如何让临时堆栈回到顶部。任何帮助都将不胜感激。

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());
}

想法?干杯!

共有2个答案

濮波
2023-03-14

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

包丁雨
2023-03-14

问题是,在最后一次还原操作之前有一个返回,所以方法返回时包含已删除的元素,而不在其后面调用代码。

通常会出现无法访问的代码错误,但在您的情况下,这不是真的,因为您没有将最后一个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;
}
 类似资料:
  • 如何从堆栈中弹出特定片段,并从片段中删除其他片段?例如,这些是我的片段,我现在在E right know。 A- 想从E回到B,清除C和D。我怎么能做到这一点?

  • 我来自C/C++背景,在这里一个进程内存分为: null 我想把我的注意力集中在这一点上,当我阅读JVM中的堆和堆栈时,我们是在谈论堆栈和堆的概念吗?并且整个JVM的实际内存驻留在堆上(这里指的是堆的C++概念)?

  • 我已经有一个stack类在工作,但是现在我每次只能弹出一个元素,我希望能够同时弹出多个元素。无需多次使用推送和弹出。我试图创建两个函数来实现这一点。函数pushAll和popN。比如: 备注:输入参数all是一个数组,包含所有必须输入的元素。向量的最后一个元素必须在叠加后位于顶部。如果没有空间插入所有元素,则必须不插入任何元素,并且必须引发StackFullException异常。popN方法弹出

  • 问题内容: 我的Java堆栈跟踪中有很多我不关心的条目,它们显示了通过代理和Spring反射方法以及类似内容进行的方法调用。很难从我的代码中挑选出堆栈跟踪的一部分。Ruby on Rails包含一个“堆栈跟踪清理器”,您可以在其中指定要从打印的堆栈跟踪中忽略的堆栈跟踪模式列表-对于Java而言,这样做的最佳方法是什么? 最好在任何地方都可以使用它,包括在Eclipse jUnit运行程序中。 问题

  • 问题内容: Python具有实现堆数据结构的模块,并且它支持一些基本操作(推送,弹出)。 如何从O(log n)中的堆中删除第i个元素?甚至可以使用还是必须使用另一个模块? 请注意,文档底部有一个示例:http : //docs.python.org/library/heapq.html ,它建议了一种可能的方法-这不是我想要的。我希望删除元素,而不仅仅是标记为已删除。 问题答案: 您可以很容易地