递归调用如何与堆栈一起使用?我有此示例代码,其中行B
打印B 654321
,c
打印C
,d
打印D 2468
和e
一个例外。我不明白为什么程序要打印这些输出!例如,在B行中,s
是否由于堆栈而变成0
?谢谢
public class Problem1 {
public static void main(String args[]) {
Stack<Integer> s = setStack(5); printStack("A", s); // line A
s = setStack(6); stackStack(s); printStack("B", s); // line B
s = setStack(8); cutStack(s); printStack("C", s); // line C
s = setStack(8); s = cutStack(s); printStack("D", s); // line D
s = setStack(7); s = cutStack(s); printStack("E", s); // line E
}
public static Stack<Integer> setStack(int n) {
Stack<Integer> ans = new Stack<>();
for (int i = 1; i <= n; i++)
ans.push(i);
return ans;
}
public static void printStack(String tag, Stack<Integer> s) {
System.out.print(tag + " ");
while (!s.empty()) System.out.print(s.pop());
System.out.println();
}
public static Stack<Integer> cutStack(Stack<Integer> s)
{
Stack<Integer> ans = new Stack<>();
while (!s.empty()) {
ans.push(s.pop());
s.pop();
}
s = ans; return s;
}
public static void stackStack(Stack<Integer> s) {
if (s.empty()) return;
int x = s.pop();
stackStack(s);
s.push(x);
}
}
答案 0 :(得分:0)
对于stackStack,请考虑使用较小的堆栈:123(堆栈顶部为3)。
假设F1是对stackStack()
的第一个调用,F2是嵌套的调用,依此类推。
F1:stackStack(123)
弹出3并将其存储在x中。所以x_1=3
和s=12
F2:现在调用stackStack(12)
。所以x_2=2
和s=1
F3:现在调用stackStack(1)
。现在,x_3=1
和s
为空。
现在,s
为空。因此,控件只需返回F3。
F3然后将x_3 =1
推入空白s
上。因此s=1
,控件返回到F2。
F2将x_2=2
推到s=1
上。这样s=12
,控件返回到F1。
F1将x_1=3
推到s=12
上。 s=123
。
您刚刚获得了原始堆栈,而printStack()
仅打印出321。
这应该使您大致了解递归的工作原理。