使用递归实现 Stack 的 Pop 方法

Posted

技术标签:

【中文标题】使用递归实现 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();
    



【讨论】:

以上是关于使用递归实现 Stack 的 Pop 方法的主要内容,如果未能解决你的问题,请参考以下文章

快速排序非递归实现

利用栈非递归实现块排

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

队列栈和递归遍历目录

编程3:仅用递归函数和栈操作逆序一个栈

二叉树前序遍历非递归写法