【问题标题】:Removing a specific element in a stack删除堆栈中的特定元素
【发布时间】:2013-11-07 23:42:24
【问题描述】:

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

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

想法?干杯!

【问题讨论】:

    标签: java stack


    【解决方案1】:

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

    您通常会遇到 unreachable code 错误,但在您的情况下,情况并非如此,因为您没有将最后一个 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;
    }
    

    【讨论】:

    • 就是这样。感谢您的帮助!
    【解决方案2】:

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

    【讨论】:

    • 如果我想做这样的事情,你的观点是有效的并且被广泛接受,堆栈不是最好的数据结构。如果索引大于堆栈,请注意案例。谢谢!
    猜你喜欢
    • 2021-05-27
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多