使用递归实现 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 方法的主要内容,如果未能解决你的问题,请参考以下文章