2012-10-10 83 views
3

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

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


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

您需要从弹出窗口中调用弹出窗口。 – wulfgarpro

+0

到目前为止我所做的是我试图将方法改为像这样的流行(int Top),其中“top”指向堆栈中的最后一项。然后递归地调用它。有一个像top == -1这样的基本情况,但它不起作用。 – aaa

+0

通过输入关键字 - '“递归”'在谷歌上搜索'..你会发现很多例子..它不是编程语言特定的..所以,你不必担心语言......在实现之前,你应该在你的笔记本上得到'递归'的感觉.. –

回答

0

感谢每一位,我解决了这个问题。不知道是否有效,但我确实喜欢如下:

public void pop() 
{ 

    if(isEmpty()){ 

     return; 
    } 

    if (top>=0){ 

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


} 
0

你需要考虑那里是没有在堆叠的基础情况,即stack.pop() == null

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

+0

是的,但我的问题是如何再次调用它,我的意思是我需要以某种方式改变指针顶部(减少它)对不对?我不能这样做 – aaa

+0

我认为你应该这样做: 'if(baseCase)return; else System.Out.println(stack.pop());' 将整个块放到你的'pop'方法中,这样它就会被重复调用,直到基本情况被打中。 – rexcfnghk

0

重复调用pop()直到堆栈结束。 由于您尚未提及数据如何存储无法帮助您提供代码。

+0

数据存储在ARRAY – aaa

+0

所以你需要调用'pop()'直到数组为空:) –

4

首先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 - 你的堆栈的实现。

希望这有助于