代码运行良好。只是我不明白。在递归部分有困难。在这部分:char a = st.peek();st.pop(); insert_at_bottom(x); st.push(a);
我的想法是首先它会一直执行 char a = st.peek();st.pop()
直到达到阈值。然后它会执行 st.push(a);
一次。所以 a
只会被赋值一次。显然这不是真的。
对我来说困难的部分是在 insert_at_bottom
方法中 insert_at_bottom(x)
有什么作用?在 reverse
方法中,reverse()
、insert_at_bottom(x)
做什么?
import java.util.Stack;
class Test {
static Stack<Character> st = new Stack<>();
static void insert_at_bottom(char x)
{
if(st.isEmpty()) st.push(x);
else
{char a = st.peek();
st.pop();
insert_at_bottom(x);
st.push(a);
}
}
static void reverse()
{
if(st.size() > 0)
{
char x = st.peek();
st.pop();
reverse();
insert_at_bottom(x);
}
}
public static void main(String[] args)
{ st.push('1'); st.push('2'); st.push('3'); st.push('4');
System.out.println("Original Stack");
System.out.println(st);
reverse();
System.out.println("Reversed Stack");
System.out.println(st); }}
答案 0 :(得分:1)
首先,我们将使用 []
表示堆栈。空堆栈将表示为 []
。当我们推送或弹出一个元素时,我们将在左侧进行。例如,如果我们以 [1, 2, 3]
和 pop 开头,我们将剩下 [2, 3]
,pop 将返回 1
。如果我们从 [1, 2, 3]
开始并按 0
,我们将剩下 [0, 1, 2, 3]
。
insert_at_bottom
的唯一目的是使我们能够将一个元素推送到堆栈的右侧,而不是左侧。 .
那么我们如何在堆栈的右侧而不是左侧插入一些东西(假设我们想要插入 x
)?我们考虑两种不同的情况:
st = []
。在这种情况下,向右推和向左推是一回事,所以我们只需调用 st.push(x)
,现在有 st = [x]
。
首先,我们从堆栈中弹出 '1'
。现在我们有了st = ['2', '3']
。
然后,我们通过递归调用将 x 推到 st
的右侧。这给了我们st = ['2', '3', x]
。
最后,我们将 '1'
推回堆栈。这给了我们st = ['1', '2', '3', x]
。如您所见,我们已经成功地在 x
的最右边位置插入了 st
。
这就是 insert_at_bottom
的工作原理。
现在 reverse
是如何工作的?我们再次考虑两种不同的情况。
st = []
。在这种情况下,我们不需要做任何事情来反转 st
。
st = ['1', '2', '3']
为例。首先,我们从堆栈中弹出 '1'
,留下 st = ['2', '3']
。
然后,我们反转 st
,留下 st = ['3', '2']
。
最后,我们通过调用 '1'
在 st
的右侧插入 insert_bottom('1')
,留下 st = ['3', '2', '1']
。
如您所见,我们已成功反转 st
。
答案 1 :(得分:0)
要了解您的方法的作用,您必须了解 Stack
是什么。 Stack
就像一堆盘子:您只能将盘子放在堆栈的顶部,或者从顶部取回盘子。否则,堆栈将崩溃。
如果你想在盘子底部添加一个盘子,你必须先把所有的盘子都去掉。简单的方法是执行以下操作:当堆栈上有一个盘子时,您将其取出并放在一边。如果堆栈是空的,那么您可以将新盘子放在堆栈的底部。然后你必须把所有的盘子放回新底板上。
在 insert_at_bottom
中完全相同的操作,但使用递归方法:当您的堆栈中有一个 char
- 即它不为空 - 时,您将顶部 char
- 标记为 a
- 放在一边,您再次尝试将 x
放在底部。如果堆栈不为空,则重新执行该操作。到达堆栈底部后,您可以将 x
放在那里,然后开始按与之前相同的顺序推送所有其他 char
。
reverse
方法使用几乎相同的过程,但略有不同:取顶部 char
,放在一边,取第二个顶部 char
,放在一边,。 .. 当你在最后一个 char
时,你可以把它放在堆栈的底部。然后你把之前第二个底部的 char
放在堆栈的底部......然后你回到你放在最后一个底部的之前的顶部 char
。然后你的所有堆栈都被反转了。