【算法系列-栈与队列】栈与队列的双向模拟

【算法系列-栈与队列】栈与队列的双向模拟

欢迎来到【算法系列】第五弹 🏆 栈与队列,接下来我们将围绕栈与队列这类型的算法题进行解析与练习!一起加油吧!!( •̀ ω •́ )✧✨

文章目录

  • 【算法系列-栈与队列】栈与队列的双向模拟
    • 1. 用栈实现队列(LeetCode 232)
      • 1.1 思路分析🎯
      • 1.2 解题过程🌰
      • 1.3 代码示例✨
    • 2.用队列实现栈(LeetCode 225)
      • 2.1 思路分析🎯
      • 2.2 代码示例🌰

1. 用栈实现队列(LeetCode 232)

【题目链接】232. 用栈实现队列 - 力扣(LeetCode)

1.1 思路分析🎯

这里使用两个栈来实现队列:一个栈stackIn用来添加元素,另一个栈stackOut用来弹出元素

1.2 解题过程🌰

队列添加元素:将元素添加到stackIn即可; 队列弹出元素

  • 若stackOut不为空,此时的stackOut栈顶元素即为队首元素,弹出即可;

  • 若stackOut为空,先将stackIn中的所有元素都弹出并添加到stackOut中,遍历完后stackOut的栈顶元素即为需要弹出的队首元素,符合队列的先进先出,弹出即可;5

队列返回队首元素

  • 若stackOut不为空,此时的stackOut栈顶元素即为队首元素,返回即可;
  • 若stackOut为空,重复上述过程将stackIn中的所有元素都弹出并添加到stackOut中,并返回stackOut栈顶元素即可

队列判断是否为空队列:若两个栈都为空则队列为空,否则队列不为空

1.3 代码示例✨

class MyQueue {

    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    public MyQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }
    
    public void push(int x) {
        stackIn.push(x);
    }
    
    public int pop() {
        initQueue();
        return stackOut.pop();
    }
    
    public int peek() {
        initQueue();
        return stackOut.peek();
    }
    
    public boolean empty() {
        return stackIn.isEmpty() && stackOut.isEmpty();
    }

    public void initQueue() {
        if (!stackOut.isEmpty()) {
            return;
        }
        while (!stackIn.isEmpty()) {
            stackOut.push(stackIn.pop());
        }
    }
}

2.用队列实现栈(LeetCode 225)

【题目链接】225. 用队列实现栈 - 力扣(LeetCode)

2.1 思路分析🎯

这道题可以有两种方式进行模拟,一种使用单队列,一种使用双队列,这里针对使用单队列的方式进行模拟实现栈:

这里使用了一个队列来实现栈,比较方便快捷,单队列实现栈的操作方式需要注意的就是如何找到栈顶元素,思路就是将队列 前 size - 1 个元素移除后重新加入队列,这样等到最后遍历完此时的队首元素就是栈顶元素了

2.2 代码示例🌰

单队列实现栈的代码如下:

class MyStack {
    
    Queue<Integer> queue;

    public MyStack() {
        queue = new LinkedList<>();
    }
    
    public void push(int x) {
        queue.offer(x);
    }
    
    public int pop() {
        initQueue();
        return queue.poll();
    }
    
    public int top() {
        initQueue();
        // 队列的入口处的第一个元素即栈顶元素,通过将队列元素重新插入队列来将这个栈顶元素拍到出口处,
        // 记录下结果后仍需要将这个元素重新插入队尾
        int ret = queue.poll();
        queue.offer(ret);
        return ret;
    }
    
    public boolean empty() {
        return queue.isEmpty();
    }

    // 将队列元素重新插入队列,最后的队首元素即为栈顶元素
    public void initQueue() {
        int size = queue.size();
        size--;
        while (size > 0) {
            queue.offer(queue.poll());
            size--;
        }
    }
}

双队列实现栈的代码如下:

class MyStack {

    Queue<Integer> q1;
    Queue<Integer> q2;


    public MyStack() {
        q1 = new LinkedList<>();
        q2 = new LinkedList<>();
    }

    /*入栈*/
    public void push(int x) {
        if(!q1.isEmpty()) {
            q1.offer(x);
        }
        else if(!q2.isEmpty()) {
            q2.offer(x);
        }
        else {
            q1.offer(x);
        }
    }

    /*出栈*/
    public int pop() {

        if (empty()) {
            return -1;
        }

        if (!q1.isEmpty()) {
            int size = q1.size();
            for (int i = 0;i < size - 1;i++) {
                q2.offer(q1.poll());
            }
            return q1.poll();
        }
        else {
            int size = q2.size();
            for (int i = 0;i < size -1;i++) {
                q1.offer(q2.poll());
            }
            return q2.poll();
        }
    }

    /*获取栈顶元素*/
    public int top() {
        if (empty()) {
            return -1;
        }

        if (!q1.isEmpty()) {
            int size = q1.size();
            int x = -1;
            for (int i = 0;i < size;i++) {
                x = q1.poll();
                q2.offer(x);
            }
            return x;
        }
        else {
            int size = q2.size();
            int  x = -1;
            for (int i = 0;i < size;i++) {
                x = q2.poll();
                q1.offer(x);
            }
            return x;
        }
    }

    public boolean empty() {
        return q1.isEmpty() && q2.isEmpty();
    }
}

以上便是对栈与队列的双向模拟问题的介绍了!!后续还会继续分享其它算法系列内容,如果这些内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧( •̀ ω •́ )✧✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/897132.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Centos安装Nginx 非Docker

客户的机器属于 Centos7 系列&#xff0c;由于其较为陈旧&#xff0c;2024开始众多镜像和软件源都已失效。此篇文章将详细记录在 Centos7 操作系统上从零开始安装 Nginx 的整个流程。 本文Nginx是安装在/usr/local/nginx下 详细步骤如下&#xff1a; 准备Nginx安装包&#x…

安防监控摄像头图传模组,1公里WiFi无线传输方案,监控新科技

在数字化浪潮汹涌的今天&#xff0c;安防监控领域也迎来了技术革新的春风。今天&#xff0c;我们就来聊聊这一领域的产品——摄像头图传模组&#xff0c;以及它如何借助飞睿智能1公里WiFi无线传输技术&#xff0c;为安防监控带来未有的便利与高效。 一、安防监控的新篇章 随着…

程序员适合玩的游戏:《人力资源机器》提升编程思维【Human Resource Machine】

程序员适合玩的游戏&#xff1a;《人力资源机器》提升编程思维【Human Resource Machine】 在当今这个技术日新月异的时代&#xff0c;编程已经成为一门不可或缺的技能。对于程序员来说&#xff0c;不仅需要扎实的专业知识&#xff0c;还需要不断锻炼逻辑思维和解决问题的能力…

用.NET开发跨平台应用程序采用 Avalonia 与MAUI如何选择

Avalonia是一个强大的框架&#xff0c;使开发人员能够使用.NET创建跨平台应用程序。它使用自己的渲染引擎绘制UI控件&#xff0c;确保在Windows、macOS、Linux、Android、iOS和WebAssembly等不同平台上具有一致的外观和行为。这意味着开发人员可以共享他们的UI代码&#xff0c;…

RNN、LSTM 与 Bi-LSTM

一. RNN 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是深度学习领域一类具有内部自连接的神经网络能够学习复杂的矢量到矢量的映射。 最大特点&#xff1a;前面的序列数据可以用作后面的结果预测中。 一个简单的循环神经网络结构&#xff0c;其结构包…

如何写一个视频编码器演示篇

先前写过《视频编码原理简介》&#xff0c;有朋友问光代码和文字不太真切&#xff0c;能否补充几张图片&#xff0c;今天我们演示一下&#xff1a; 这是第一帧画面&#xff1a;P1&#xff08;我们的参考帧&#xff09; 这是第二帧画面&#xff1a;P2&#xff08;需要编码的帧&…

Golang | Leetcode Golang题解之第480题滑动窗口中位数

题目&#xff1a; 题解&#xff1a; type hp struct {sort.IntSlicesize int } func (h *hp) Push(v interface{}) { h.IntSlice append(h.IntSlice, v.(int)) } func (h *hp) Pop() interface{} { a : h.IntSlice; v : a[len(a)-1]; h.IntSlice a[:len(a)-1]; return v }…

SCCB协议与IIC协议不同

SCCB开始信号与结束信号都与IIC协议的大概一致&#xff0c;这里就不细讲了 开始、结束信号参考&#xff1a;【I2C】IIC读写时序_iic读时序-CSDN博客 SSCB写时序&#xff1a; 即&#xff1a;start phase_1 phase_2 phase_3 stop SCCB读时序&#xff1a; 即&#xff…

电脑视频剪辑大比拼,谁更胜一筹?

随着短视频的火爆&#xff0c;越来越多的人开始尝试自己动手制作视频&#xff0c;无论是记录生活点滴还是创作个性短片&#xff0c;一款好用的视频剪辑软件是必不可少的。今天&#xff0c;我们就从短视频运营的角度&#xff0c;来聊聊几款热门的电脑视频剪辑软件&#xff0c;看…

在做题中学习(66):两数相加

解法&#xff1a;模拟 思路&#xff1a;定义一个变量t&#xff0c;存储相加后的结果&#xff0c;个位赋给新节点&#xff0c;十位&#xff08;表示有进位&#xff09;留下&#xff0c;累加到下一次加法&#xff08;相当于上进位&#xff09;。while里即便cur1和cur2都为空了&a…

windows文件拷贝给wsl2的Ubuntu

参考&#xff1a; windows文件如何直接拖拽到wsl中_win 移到文件到wsl-CSDN博客 cp -r /mnt/盘名/目标文件 要复制到wsl中的位置e.g.cp -r /mnt/d/byt5 /home Linux文件复制、移动、删除等操作命令_linux移动命令-CSDN博客 Linux 文件、文件夹的复制、移动、删除 - Be-myse…

重生之“我打数据结构,真的假的?”--1.顺序表(无习题)

C语言中的顺序表详细总结 1. 概述 顺序表&#xff08;Sequential List&#xff09;是一种线性数据结构&#xff0c;用于存储具有相同数据类型的一组元素。顺序表采用一段连续的存储空间&#xff0c;使用数组来实现&#xff0c;能够高效地支持随机访问操作。在 C 语言中&#…

No.19 笔记 | WEB安全 - 任意文件操作详解 part 1

1. 任意文件上传漏洞基础 什么是文件上传功能? 在网站和应用中,我们经常会看到允许用户上传文件的功能,比如: 更换头像:让用户上传自己的照片作为头像发布图片:在社交媒体或论坛上传图片提交文档:在办公系统中上传Word、Excel等文档 这些都是常见的文件上传功能。 任意文…

RabbitMQ系列学习笔记(四)--消息应答机制

文章目录 一、消息应答详解1、基本概念2、自动应答3、手动应答4、自动重新入队5、手动应答代码6、手动应答演示 二、不公平分发三、预取值机制 本文参考&#xff1a; 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程…

如何去掉歌曲的人声只剩伴奏?伴奏独享的方法

在音乐制作、后期处理或是个人娱乐中&#xff0c;我们经常遇到需要将歌曲中的人声去除&#xff0c;仅保留伴奏的情况。虽然这一过程可能听起来颇为复杂&#xff0c;但实际上&#xff0c;借助现代音乐技术和软件&#xff0c;我们可以较为轻松地达成这一目标。本文将介绍三种常见…

[AWS]RDS数据库版本升级

背景&#xff1a;由于AWS上mysql5.7版本不再支持&#xff0c;需要进行版本升级。 吐槽&#xff1a;每年都要来那么几次&#xff0c;真的有病一样&#xff0c;很烦。 步骤一、升级检查 AWS提供了一个python的升级检测脚本&#xff0c;可以按照一下脚本下载测试&#xff1a; [r…

机器视觉基础系列2—简单了解用神经网络进行深度估计

机器视觉基础系列2—简单了解深度估计 深度估计 深度估计通俗的来讲就是要得到一张图像当中&#xff0c;哪些区域离得比较近&#xff0c;哪些区域离得比较远。 输入一张彩色得图像&#xff0c;我们输出深度估计得图像&#xff0c;深浅即为远近&#xff08;从而完成了离相机距离…

Git安装与配置(2.47.0版本超详细)

一、背景 1.什么是gitt&#xff1f;&#xff08;官网引用&#xff09; Git 是一个快速、可扩展的分布式版本控制系统&#xff0c;它拥有异常丰富的命令集&#xff0c;可以提供高级操作和对内部的完全访问。 参阅 gittutorial[7] 开始使用&#xff0c;然后查看 giteveryday[7] …

【2022统考真题】计算时间复杂度

目录 一、题目描述 二、思路分析 三、易错提醒 四、同级和嵌套的关系 一、题目描述 下列程序段的时间复杂度是&#xff08;&#xff09; int sum 0; for (int i 1; i < n; i * 2) for (int j 0; j < i; j) sum; A. O(logn) B. O(n) C. O(nlogn) D…

使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题

一、项目简介 使用过ABP框架的童鞋应该知道它也自带了一款免费的Blazor UI主题&#xff0c;它的页面是长这样的&#xff1a; 个人感觉不太美观&#xff0c;于是网上搜了很多Blazor开源组件库&#xff0c;发现有一款样式非常不错的组件库&#xff0c;名叫&#xff1a;Radzen&am…