Java:使用递归返回自制的堆栈大小

时间:2015-02-02 17:31:49

标签: java recursion stack size

所以当我注意到我上传的内容时,我已经在课堂上完成了一些任务。部分内容是写一个堆栈和一个节点类,它应该有一个方法来返回堆栈的当前大小。我错过了我实际上需要在size方法中使用递归的事实。所以我尝试了一些东西,我得到了正确的结果。这是代码:

public class CharStack {

    private CharStackNode top;

    public CharStack() {
        top=null;
    }

    public void push(char img) {
        CharStackNode node=new CharStackNode(img, top);
        top=node;
    }

    public char pop() {
        char result = top.getImage();
        top = top.getNext();
        return result;
    }

    public char peek() {
        return top.getImage();
    }

    public int size() {
        int counter=0;
        if(this.top!=null) {
        counter=this.top.size();
        }
        return counter;
    }

    public boolean empty() {
        return top == null;
    }
}

正如您所看到的,我正在调用节点的大小方法来实际确定大小。这是节点类:

public class CharStackNode {

    private char image;
    private CharStackNode next;

    public CharStackNode(char image, CharStackNode next) {
        this.image = image;
        this.next = next;
    }

    public char getImage() {
        return image;
    }

    public CharStackNode getNext() {
        return next;
    }

    public int size() {
        int count=0;
        if(this.next!=null) {
            count=this.next.size();
        }
        count+=1;
        return count;
    }
}

正如您所看到的,我在节点的大小方法中执行递归部分。但是,赋值基本上意味着不在节点类中使用额外的大小方法(尽管我可以使用所有其他方法)。而且还有我的问题 - 在使用递归时,我不知道如何以任何其他方式实现它。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以在堆栈类的私有方法上实现所需的递归,size()方法仅用作前端。这将允许您定义控制递归所需的任何参数。例如,您可以实现这样的递归方法:

private int tailSize(CharStackNode from) {
    return (from == null) ? 0 : (1 + tailSize(from.getNext()));
}

并将您的CharStack.size()写为

public int size() {
    return tailSize(top);
}

请注意,递归是解决此特定问题的一种不好的方法。迭代解决方案具有更少的开销,并不是特别复杂:

public int size() {
    int rval = 0;

    for (CharStackNode next = top; next != null; next = next.getNext()) {
        rval += 1;
    }

    return rval;
}

答案 1 :(得分:0)

您可以从自己的堆栈类而不是从节点类调用递归函数。可以使用循环而不是递归来获取大小。

使用您的代码从堆栈调用(以top作为参数调用此方法):

public int size(CharStackNode node) {

    // check to see if this node is null
    if (node == null) {
        return 0;
    }

    // call this function with the next node as the parameter
    tempInt = size(node.getNext());

    return  tempInt + 1;
}