【算法】用递归的方法逆序输出或倒置一个栈

简介: 【算法】用递归的方法逆序输出或倒置一个栈

前言

我们知道,栈是先进先出的,也就是如果一个栈的输入数据为1,2,3,4,5,那么他的输出数据为5,4,3,2,1。

而如果我们想要以队列的方式先进先出一个栈,那么我们就需要用到两个栈,或者,按照标题所说的,我们可以使用递归的方式,来使用一个栈来逆序输出栈中的数据。

两个栈制作一个队列

同时,我们也可以考虑逆序这个栈,也可以做到先进先出的效果。

思路分析

递归函数1:将栈stack的栈底元素移除并且返回。

具体方法如下:

package com.base.learn.stack;
import java.util.Stack;
/**
 * @author: 张锦标
 * @date: 2023/5/27 15:28
 * ReverseStack类
 * 使用递归和栈,来反转输出一个栈
 */
public class ReverseStack {
    private static Stack<Integer> stack = new Stack<>();
    public static int getAndRemoveLastElement(Stack<Integer> stack){
        int result = stack.pop();
        if (stack.isEmpty()){
            return result;
        }else{
            int last = getAndRemoveLastElement(stack);
            stack.push(result);
            return last;
        }
    }
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        System.out.println(getAndRemoveLastElement(stack));
        System.out.println(getAndRemoveLastElement(stack));
        System.out.println(getAndRemoveLastElement(stack));
        System.out.println(getAndRemoveLastElement(stack));
        System.out.println(getAndRemoveLastElement(stack));
    }
}

这里我并不讲解或者画图它是如何做到的,这里建议你直接debug。

递归函数2:逆序一个栈。

我们可以基于递归函数1,递归函数1已经帮我们拿到了最接近栈底的元素了,那么我们只需要拿到这个元素的时候,将其塞入到队列中即可。

代码如下:

package com.base.learn.stack;
import java.util.Stack;
/**
 * @author: 张锦标
 * @date: 2023/5/27 15:28
 * ReverseStack类
 * 使用递归和栈,来反转输出一个栈
 */
public class ReverseStack {
    private static Stack<Integer> stack = new Stack<>();
    public static int getAndRemoveLastElement(Stack<Integer> stack){
        int result = stack.pop();
        if (stack.isEmpty()){
            return result;
        }else{
            int last = getAndRemoveLastElement(stack);
            stack.push(result);
            return last;
        }
    }
    public static void reverse(Stack<Integer> stack){
        if (stack.isEmpty()){
            return ;
        }
        int i = getAndRemoveLastElement(stack);
        System.out.println(i);
        reverse(stack);
        stack.push(i);
    }
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        System.out.println(stack);
        reverse(stack);
        System.out.println(stack);
        //System.out.println(getAndRemoveLastElement(stack));
        //System.out.println(getAndRemoveLastElement(stack));
        //System.out.println(getAndRemoveLastElement(stack));
        //System.out.println(getAndRemoveLastElement(stack));
        //System.out.println(getAndRemoveLastElement(stack));
    }
}

简单讲解

getAndRemoveLastElement方法通过递归的方式,直接访问到了栈的最下层的元素,并且通过递归的方式,出栈这个栈底元素之后,再把其上面的元素再继续压回去,因此做到了不修改栈结构,不使用额外空间的方式来输出栈底元素。

reverse方法则依赖于这个第一个方法,我们知道第一个方法会先输出栈底元素,那么,当reverse方法遍历到最深的时候,其实是得到栈顶元素的时候,因为是逆序的!

所以,当第一个方法递归结束,我们得到的是栈顶的元素,并且第一个方法的每一次调用都会从栈底删除一个元素,那么当第一个方法的递归调用结束的时候,栈以空,那么此时我们拿着栈顶元素,放入到栈中,从而得到逆序栈!


相关文章
|
2月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
2月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
2月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
22 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
2月前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
146 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
3月前
|
机器学习/深度学习 编解码 监控
算法金 | 深度学习图像增强方法总结
**图像增强技术概括** 图像增强聚焦于提升视觉效果和细节,广泛应用于医学、遥感等领域。空间域增强包括直方图均衡化(增强对比度)、对比度拉伸、灰度变换、平滑滤波(均值、中值)和锐化滤波(拉普拉斯、高通)。频率域增强利用傅里叶变换、小波变换,通过高频和低频滤波增强图像特征。现代方法涉及超分辨率重建、深度学习去噪(如CNN、Autoencoder)、图像修复(如GAN)和GANs驱动的多种图像处理任务。
81 14
算法金 | 深度学习图像增强方法总结
|
2月前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
2月前
|
算法
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
|
2月前
|
算法
【算法】递归、搜索与回溯——简介
【算法】递归、搜索与回溯——简介
|
2月前
|
算法
【算法】栈算法——逆波兰表达式求值
【算法】栈算法——逆波兰表达式求值
|
2月前
|
存储 算法
【算法】栈算法——最小栈
【算法】栈算法——最小栈
下一篇
无影云桌面