理解java中的堆栈递归

时间:2021-05-29 08:37:23

标签: java recursion

代码运行良好。只是我不明白。在递归部分有困难。在这部分: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); }}

2 个答案:

答案 0 :(得分:1)

首先,我们将使用 [] 表示堆栈。空堆栈将表示为 []。当我们推送或弹出一个元素时,我们将在左侧进行。例如,如果我们以 [1, 2, 3] 和 pop 开头,我们将剩下 [2, 3],pop 将返回 1。如果我们从 [1, 2, 3] 开始并按 0,我们将剩下 [0, 1, 2, 3]

insert_at_bottom 的唯一目的是使我们能够将一个元素推送到堆栈的右侧,而不是左侧。 .

那么我们如何在堆栈的右侧而不是左侧插入一些东西(假设我们想要插入 x)?我们考虑两种不同的情况:

  1. 堆栈为空:即st = []

在这种情况下,向右推和向左推是一回事,所以我们只需调用 st.push(x),现在有 st = [x]

  1. 栈为非空:例如栈为['1', '2', '3']。

首先,我们从堆栈中弹出 '1'。现在我们有了st = ['2', '3']
然后,我们通过递归调用将 x 推到 st 的右侧。这给了我们st = ['2', '3', x]
最后,我们将 '1' 推回堆栈。这给了我们st = ['1', '2', '3', x]。如您所见,我们已经成功地在 x 的最右边位置插入了 st

这就是 insert_at_bottom 的工作原理。

现在 reverse 是如何工作的?我们再次考虑两种不同的情况。

  1. 栈为空;也就是说,st = []

在这种情况下,我们不需要做任何事情来反转 st

  1. 栈非空;我们将以 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。然后你的所有堆栈都被反转了。

相关问题