java Stack pop返回值作为list.remove参数遇到问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java Stack pop返回值作为list.remove参数遇到问题相关的知识,希望对你有一定的参考价值。

Stack<Integer>record=new Stack<Integer>();
List<String>unlistedword=new LinkedList<String>();
while(!record.isEmpty())
Integer h=record.pop();
System.out.println("test h="+h);
unlistedword.remove(h);

代码如上,为什么这句话会执行之后,unlistedword这个list中h位置上的元素没有被remove掉?
而且,在调试的时候,myeclipse中watch h的值,无法显示,但是h的值能够通过system。out正确输出。这无法显示与无法正确remove是不是有什么关系?

很奇怪,可以watch h的值了。。而且程序正确运行了,不知道为什么

这个是java独有的特性,很诡异的。因为List是自动扩容的,所以在定义每个元素的地址时会有不确定的事发生。你这段代码应该把unlistedword.removed(h)放到上一句,毕竟程序的代码是顺序的。其次,java集合框架下,元素的进出不是固定的位置,这个的确存在。 参考技术A 能给可以跑起来的代码吗?

使用递归实现 Stack 的 Pop 方法

【中文标题】使用递归实现 Stack 的 Pop 方法【英文标题】:Implementing Stack's Pop method with Recursion 【发布时间】:2012-09-30 13:25:44 【问题描述】:

我正在自学java。这两天我一直在研究数据结构。我正在阅读“Java 中的数据结构和算法”一书。我有一个练习有问题。它要求使用递归实现 pop 方法,以便在调用该方法时它应该立即删除所有项目。有人可以帮忙吗?关于如何做到这一点的指针将不胜感激。谢谢。 (以下是当前实现的pop方法)。

    public double pop() // take item from top of stack



        return stackArray[top--]; // access item, decrement top

【问题讨论】:

你需要从pop内部调用pop。 到目前为止,我所做的是尝试将方法更改为类似 pop(int Top) 的方法,其中“top”指的是堆栈上的最后一项。然后递归调用它。有一个类似于 top == -1 的基本情况,但它不起作用。 通过输入关键字在 google 上搜索 - "Recursion".. 你会发现很多例子.. 它不是特定于编程语言的.. 所以,你不必担心语言......在实施之前,您应该在笔记本上感受一下Recursion.. @Deewanagan.. 没意义.. 因为 pop() 仅用于弹出顶部元素.. 你不需要传递它.. pop() 不应该带任何参数.. 【参考方案1】:

您需要考虑堆栈中没有任何内容的基本情况,即stack.pop() == null

对于递归情况,它非常直观,因为您只需要递归调用 pop() 直到满足基本情况。

【讨论】:

是的,但我的问题是如何再次调用它,我的意思是我需要以某种方式更改指针顶部(递减它)对吗?我做不到 我认为您应该这样做:if(baseCase) return; else System.Out.println(stack.pop()); 将整个块放入您的 pop 方法中,以便重复调用它,直到遇到基本情况。【参考方案2】:

反复调用pop() 直到堆栈结束。 由于您没有提到数据的存储方式,因此无法帮助您提供代码。

【讨论】:

数据存储在一个数组中 所以你只需要调用pop() 直到数组为空:)【参考方案3】:

首先 IMO,您应该了解如何实现此方法的非递归对应项。

可能是这样的:

public void popAll() 

  while(!stack.isEmpty()) 
      stack.pop();
  

一旦你理解了这一点,递归版本应该很容易:

public void popAllRecursive() 

     if(stack.isEmpty()) 
        //nothing to remove, return
        return;
     
     stack.pop();  // remove one stack element

     popAllRecursive(); // recursive invocation of your method


由于这是一个练习,我只是为您提供一个想法并将实现留给您(您可以考虑在 Stack 类中提供方法并使用顶部计数器和 stackArray - 您的堆栈的实现。

希望对你有帮助

【讨论】:

【参考方案4】:

谢谢大家,我解决了这个问题。不知道是否有效,但我确实喜欢以下内容:

    public void pop()


    if(isEmpty())

        return;
    

    if (top>=0)

        stackArray[top] = stackArray[top--];
        pop();
    



【讨论】:

以上是关于java Stack pop返回值作为list.remove参数遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

用两个栈实现队列的POP和PUSH操作

数据结构(Java语言)——Stack简单实现

一张图展示:用两个栈来实现一个队列,完成队列的Push和Pop操作

使用递归实现 Stack 的 Pop 方法

如何仅用递归函数和栈操作逆序一个栈

java (String) s.peek()是啥意思?