所以当我注意到我上传的内容时,我已经在课堂上完成了一些任务。部分内容是写一个堆栈和一个节点类,它应该有一个方法来返回堆栈的当前大小。我错过了我实际上需要在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;
}
}
正如您所看到的,我在节点的大小方法中执行递归部分。但是,赋值基本上意味着不在节点类中使用额外的大小方法(尽管我可以使用所有其他方法)。而且还有我的问题 - 在使用递归时,我不知道如何以任何其他方式实现它。
提前感谢您的帮助。
答案 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;
}