算法打卡 Day10(栈与队列)-用栈实现队列 + 用队列实现栈

今天开始进入栈与队列啦!

文章目录

  • 栈与队列理论基础
  • Leetcode 232-用栈实现队列
    • 题目描述
    • 解题思路
  • Leetcode 225-用队列实现栈
    • 题目描述
    • 解题思路

首先我们来学习一下栈与队列的基础知识~

栈与队列理论基础

栈与队列的区别是:栈是先进后出,队列是先进先出

在这里插入图片描述

栈和队列是 STL(C++ 标准库)中的两个数据结构。

三个最为普遍的 STL 版本:

  • HP STL:其他版本的 C++ STL,一般是以 HP STL 为蓝本实现出来的,HP STL 是 C++ STL 的第一个实现版本,而且开放源代码。
  • P.J.Plauger STL:由 P.J.Plauger 参照 HP STL 实现出来的,被 Visual C++ 编译器所采用,不是开源的。
  • SGI STL:由 Silicon Graphics Computer Systems 公司参照 HP STL 实现,被 Linux 的 C++ 编译器 GCC 所采用,SGI STL 是开源软件,源码可读性甚高。

在这里插入图片描述

栈提供 push 和 pop 等接口,所有元素符合先进后出的规则,栈不提供走访功能,也不提供迭代器(iterator),栈不像 set 或者 map 提供迭代器 iterator 来遍历所有的元素。

栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(可以控制使用哪种容器实现栈的功能),因此,STL 中栈不被归类为容器,而被归类为 container adaptor(容器适配器)

在这里插入图片描述

由图中栈的结构可知,栈的底层实现可以是 vector,deque 和 list

在常用的 STL 结构 SGI STL 中,如果没有指定底层实现时默认以 deque 为缺省情况下栈的底层结构。

deque 是一个双向队列,只要封住一端,只开通另一端就可以实现

SGI STL 中队列的底层实现在缺省情况下同样是用 deque 实现的。

指定 vector 为栈的底层实现,初始化栈的语句如下:

std::stack<int, std::vector<int>> third; //使用vector为底层容器的栈

以 list 为底层实现,初始化 queue 的语句如下:

std::queue<int, std::list<int>> third;//使用以list为底层容器的队列

同样地,STL 队列也不能被归为容器,而是 container adapter(容器适配器)。

Leetcode 232-用栈实现队列

题目描述

https://leetcode.cn/problems/implement-queue-using-stacks/description/

在这里插入图片描述

解题思路

使用栈模拟队列时,我们可以使用 in 和 out 两个栈来模拟,输入栈 push 进队列中的数据,但这个时候没有办法按照队列先进先出的顺序,因此需要一个输出栈,其与输入栈的开口方向相反,以实现 pop 时数据的先进先出

在这里插入图片描述

代码实现如下

class MyQueue {
public:stack<int>stIn;stack<int>stOut;MyQueue() {}void push(int x) {stIn.push(x);}int pop() {//首先要判断stOut是否为空if (stOut.empty()) {while (!stIn.empty()){stOut.push(stIn.top());stIn.pop();}}int result = stOut.top();stOut.pop();return result;}int peek() {int res = this->pop();//直接使用前面已经写好的pop函数,实现函数的复用stOut.push(res);//将刚刚pop函数弹出的元素添加return res;}bool empty() {return stIn.empty() && stOut.empty();}
};

Leetcode 225-用队列实现栈

题目描述

https://leetcode.cn/problems/implement-stack-using-queues/description/
在这里插入图片描述

解题思路

使用两个队列模拟栈的过程是,将栈的元素 push 进入主要队列,然后当 pop 时,采用辅助队列将除最后一个元素之外的元素纳入,之后再将主要队列中的剩余的最后一个元素 pop 出来,实现栈的 pop 功能。整体代码如下:

class MyStack {
public:queue<int>queue1;queue<int>queue2;MyStack() {}void push(int x) {queue1.push(x);}int pop() {int size = queue1.size()-1;while (size--) {int element = queue1.front();queue1.pop();queue2.push(element);}int result = queue1.front();queue1.pop();queue1 = queue2;while (!queue2.empty()) {queue2.pop();}return result;}int top() {return queue1.back();}bool empty() {return queue1.empty();}
};

进一步,我们可以优化解题思路,仅采用一个队列来模拟栈,其思路是将队列内除最后一个元素外的其他元素弹出并重新 push 入队列,这样就实现了队列的第一个元素即栈会弹出的第一个元素:

class MyStack {
public:queue<int> que;MyStack() {}void push(int x) {que.push(x);}int pop() {int size = que.size() - 1;while (size--) {que.push(que.front());que.pop();}int result = que.front();que.pop();return result;}int top() {return que.back();}bool empty() {return que.empty();}
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第111题二叉树的最小深度

题目&#xff1a; 题解&#xff1a; class Solution:def minDepth(self, root: TreeNode) -> int:if not root:return 0que collections.deque([(root, 1)])while que:node, depth que.popleft()if not node.left and not node.right:return depthif node.left:que.appen…

cnVcXsrv 21.1.13.1—VcXsrv 21.1.13中文版本简单说明~~

对于VcXsrv的使用目的和用途相信大家都很了解。前不久VcXsrv做了更新&#xff0c;并且将项目托管到github上了。链接如下&#xff1a; VcXsrv: Windows X-server based on the xorg git sourceshttps://github.com/marchaesen/vcxsrv也可以简单查看如下链接&#xff1a; VcXs…

在matlab里面计算一组给定参数的方程的解

如&#xff1a; k (1:1024); f (x)(1-x-k.*x.^2); 在这段代码给出了一组函数&#xff0c;若需要计算f0&#xff0c;可以通过自带的函数实现&#xff1a; x0 zeros(length(k),1); options optimoptions(fsolve,Display,none,TolX,tol,TolFun,tol); tic for ik 1:length…

全网讲的最详细的Docker镜像分层存储原理

先说结论&#xff0c;容器镜像分层存储图示 欢迎关注 实验环境准备 当前实验docker版本24.0.7如下&#xff0c;当前docker版本使用overlay2机制存储镜像 Client: Docker Engine - CommunityVersion: 24.0.7API version: 1.43Go version: go1.20.10…

Three.js 研究:2、如何让动画线性运动

1、默认的动画含有加速度并非线性的 制作好的动画很明显是非线性的&#xff0c;这是一个运动环&#xff0c;为了让环运行线性进行如下设置。 2、设置动画成为线性动画

Vue从入门到实战Day07

一、vuex概述 目标&#xff1a;明确vuex是什么&#xff0c;应用场景&#xff0c;优势 1. 是什么&#xff1a; vuex是一个vue的状态管理工具&#xff0c;状态就是数据。 大白话&#xff1a;vuex是一个插件&#xff0c;可以帮助我们管理vue通用的数据&#xff08;多组件共享的…

解锁数据关联之道:SQL 表连接详解

文章目录 概述表关系横向连接内连接 inner join左连接 left join右连接 right join全连接 full join交叉连接 cross join 纵向合并UNION ALLUNION 概述 在数据处理、数据分析中常会用到表连接。表连接的作用是将多个表中的数据关联起来&#xff0c;以便在查询过程中获取更全面…

家政项目day2 需求分析(模拟入职后熟悉业务流程)

目录 1 项目主体介绍1.1 项目背景1.2 运营模式1.3 项目业务流程 2 运营端需求2.1 服务类型管理2.2 服务项目&#xff08;服务&#xff09;管理2.3 区域管理2.4 区域服务管理2.5 相关数据库表的管理2.6 设计工程结构2.7 测试接口&#xff08;接口断点查看业务代码&#xff09; 1…

【机器学习与大模型】开源大模型和闭源大模型:技术发展与社会责任的平衡点

目录 &#x1f4a1;引言✈️✈️一&#xff0c;开源大模型的优势与劣势✈️✈️1.1 优势&#xff1a;✈️✈️1.2 挑战和劣势&#xff1a; &#x1f680;&#x1f680;2. 闭源大模型的优势与劣势&#x1f680;&#x1f680;2.1 优势&#xff1a;&#x1f680;&#x1f680;2.2 …

【pyspark速成专家】7_SparkSQL编程1

目录 一&#xff0c;RDD&#xff0c;DataFrame和DataSet对比 二&#xff0c;创建DataFrame 本节将介绍SparkSQL编程基本概念和基本用法。 不同于RDD编程的命令式编程范式&#xff0c;SparkSQL编程是一种声明式编程范式&#xff0c;我们可以通过SQL语句或者调用DataFrame的相…

amis 联动效果触发的几种方式

联动效果实现主要俩种方式: 1.表达式实现联动,基于组件内或数据链的变量变化的联动 比如&#xff1a; "source": "/amis/api/mock2/options/level2?name${name} " (必须是这种字符串拼接形式,在data数据映射中表达式不会触发联动) 所有初始化接口链…

Java进阶学习笔记10——子类构造器

子类构造器的特点&#xff1a; 子类的全部构造器&#xff0c;都会先调用父类的构造器&#xff0c;再执行自己。 子类会继承父类的数据&#xff0c;可能还会使用父类的数据。所以&#xff0c;子类初始化之前&#xff0c;一定先要完成父类数据的初始化&#xff0c;原因在于&…

线程生命周期

创建线程的两种方法 1.继承Thread类 2.实现Runnable接口 线程从创建到消亡分为新建、就绪、运行、阻塞、死亡5种状态。 新建状态 创建一个线程就处于新建状态。此时线程对象已经被分配了内存空间&#xff0c;并且私有数据也被初始化&#xff0c;但是该线程还不能运行。 就…

03-02-Vue组件之间的传值

前言 我们接着上一篇文章 03-01-Vue组件的定义和注册 来讲。 下一篇文章 04-Vue&#xff1a;ref获取页面节点–很简单 父组件向子组件传值 我们可以这样理解&#xff1a;Vue实例就是一个父组件&#xff0c;而我们自定义的组件&#xff08;包括全局组件、私有组件&#xff09;…

足球走地全自动化操作软件实现过程

本次采用selenium实现自动化操作的流程 打开浏览器录入账号密码等待数据请求&#xff08;监听&#xff09;有新数据&#xff0c;进行自动化操作通过homeName搜索&#xff0c;找到对应数据找到对应的类型&#xff08;让、大小…&#xff09;找到对应的盘口输入数量提交 附登录…

Python语法(全)

前言&#xff1a; 下面是Python基本的语法&#xff0c;大家耐心观看&#xff01; 1.基础语法 1.1字面量 字面量&#xff1a;在代码中&#xff0c;被写下来的的固定的值&#xff0c;称之为字面 1.2字符串 字符串&#xff08;string&#xff09;&#xff0c;又称文本&#xff…

nss做题

[NCTF 2018]签到题 1.f12在index.php中找到flag [NSSCTF 2022 Spring Recruit]ezgame 1.在js源码中就有flag [UUCTF 2022 新生赛]websign 1.打开环境后发现ctrlu和右键&#xff0c;f12都被禁用了。两种方法&#xff0c;第一种&#xff1a;禁用js&#xff1b;第二中提前打开…

vue 表单些某项 v-if 控制后,想在显示时添加验证

效果: 可以为<el-form-item>添加 key 然后prop正常写就行 (key需要唯一值) <el-form-item label"设置" v-if"advanced_setting" key"threshold" prop"threshold"><el-inputv-model"form_Warning.threshold"p…

关于burp的intruder返回包空白问题

记录一下被自己蠢笑的问题 burp返回包为空怎么办&#xff0c;在查询无果后经过多次试验&#xff0c;确实没有效果 看那三个点还以为加载呢&#xff0c;攻击完了怎么一个显示没有 于是…… 鼠标到三个点&#xff0c;往下一拉 哈哈哈哈哈哈哈&#xff0c;真是被自己给蠢到了

[5] CUDA线程调用与存储器架构

CUDA线程调用与存储器架构 前几节简单讲了如何编写CUDA程序&#xff0c;利用GPU的处理能力并行执行多个线程和块。之前所有程序里的线程是相互独立的&#xff0c;没有多个线程之间的通信多是实际应用程序需要中间线程之间的通信&#xff0c;本文将仔细讲解线程调用以及CUDA的分…