当前位置: 首页 > 知识库问答 >
问题:

理解java中的堆栈递归

麻书
2023-03-14

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

共有1个答案

蒙麒
2023-03-14

要理解您的方法是做什么的,您必须理解堆栈是什么。堆栈就像一叠盘子:只能将盘子放在堆栈的顶部,或者从顶部取回盘子。否则,堆栈将崩溃。

如果要在盘子的底部加一个盘子,你得把之前所有的盘子都拆下来。简单的方法是这样做:当堆栈上有一个盘子时,你把它移走并放在一边。如果堆栈是空的,那么你可以把你的新盘子放在堆栈的底部。然后你必须把所有的盘子放回新底板上。

insert_at_bottom中的操作完全相同,但使用了递归方法:当堆栈中有一个char(即它不是空的)时,将顶部的char(标记为a)放在一边,然后再次尝试将x放在底部。如果堆栈不为空,则重新执行该操作。一旦到达堆栈的底部,就可以将x放在那里,并开始按之前相同的顺序推送所有其他char

reverse方法使用了几乎相同的过程,但有点小的变化:取顶部的char并将其放在一边,取第二个顶部的char并将其放在一边,...当您在最后一个char上时,您可以将其放在堆栈的底部。然后将先前的第二个底部char放在堆栈的底部...然后返回到前面的顶部char,将其放在最后的底部。然后你的堆栈全部被颠倒了。

 类似资料:
  • 问题内容: 有以下代码: 并有输出: 为什么它打印八次而不是“ y”。遇到Java 时如何调用? 问题答案: 在这里您正在捉住,而不是在这种情况下您的程序会崩溃。 如果您尝试此代码(修改为添加静态计数器) 输出量 因此,它已进行了6869次(不同运行次数的更改),并打印了最后一个值。如果您只是像以前那样打印,则可能是输出被缓冲而不被刷新,因为它不是。 更新资料 在内部调用该缓冲。您不会丢失缓冲区中

  • 我想了解SWIFT中的堆栈和堆中存储了什么。我有一个粗略的估计:你打印的所有东西和内存地址都不是值,那些存储在堆栈中,而打印出来的是值,那些在堆中,基本上是根据值和引用类型。我完全错了吗?另外,可以提供堆栈/堆的可视化表示吗?

  • 本文向大家介绍java 中堆内存和栈内存理解,包括了java 中堆内存和栈内存理解的使用技巧和注意事项,需要的朋友参考一下  Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存

  • 让我们回到函数,进行更深入的研究。 我们的第一个主题是 递归(recursion)。 如果你不是刚接触编程,那么你可能已经很熟悉它了,那么你可以跳过这一章。 递归是一种编程模式,在一个任务可以自然地拆分成多个相同类型但更简单的任务的情况下非常有用。或者,在一个任务可以简化为一个简单的行为加上该任务的一个更简单的变体的时候可以使用。或者,就像我们很快会看到的那样,处理某些数据结构。 当一个函数解决一

  • Python/CS新手,试图了解特定递归函数如何“在引擎盖下”工作,函数的堆栈框架如何运行,它们“持有”的值是什么 我知道这里有很多关于递归函数的文章/帖子,这里有它们如何工作的示例,但递归的概念和堆栈如何工作/它们在递归函数中的作用有点棘手,我找不到任何清晰简洁的解释。 假设我们有以下递归函数来反转字符串中的字符: 其输出为:< code>olleh 我认为<code>reverse_strin

  • 本文向大家介绍Java中堆和栈的区别详解,包括了Java中堆和栈的区别详解的使用技巧和注意事项,需要的朋友参考一下 当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先出(Last In First Out)的顺序的数据结构,这就是java.util.