算法打卡 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…

1.4 视频标准组织 - ITU

1.4 视频标准组织 - ITU 关于 ITU 国际电信联盟&#xff08;International Telecommunication Union&#xff0c;简称 ITU&#xff09;是一个国际组织&#xff0c;主要负责确立国际无线电和电信的管理制度和标准。 关于 ITU-R 国际电信联盟无线电通信部门&#xff08;ITU R…

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…

9数据通信名词解释2

奈氏准则 在理想低通&#xff08;无噪声&#xff0c;带宽受限&#xff09;条件下&#xff0c;为了避免码间串扰&#xff0c;极限码元传输速率为2WBaud&#xff0c;W是信道带宽&#xff0c;单位是赫兹 结论&#xff1a; ①在任何信道中&#xff0c;码元的传输速率是有上限的&…

.Net Core WebAPI参数的传递方式

Controller继承自ControllerBase&#xff0c;只不过增加了视图相关的方法&#xff0c;一般mvc项目选用Controller而Web API项目选择ControllerBase即可。 给服务器传递参数的时候&#xff0c;有URL、QueryString、请求报文体3种方式 请求路径/Student/GetAll/school/MIT/class…

在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、设置动画成为线性动画

【vue3】嵌套的 effect 与 effect 栈

在 Vue 3 的响应式系统中&#xff0c;effect 是一个非常重要的概念。effect 是一个函数&#xff0c;它接受一个执行副作用&#xff08;side effect&#xff09;的函数作为参数&#xff0c;并返回一个可以停止这个副作用的函数。当响应式数据发生变化时&#xff0c;Vue 3 会自动…

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;以便在查询过程中获取更全面…

嵌入式0基础开始学习 ⅠC语言(8)结构体

0.问题引入 C语言是允许程序员定义自己的组合类型 构造类型 》 数组 结构体 枚举 共用体/联合体 …

Vxetable 递归多级表头

在对vxetable 进行二次封装的时候&#xff0c;多级表头也是需要考虑进去的&#xff0c;所以需要封装一个递归列组件进行多级表头的一个渲染。 // my-table.vue <vxe-tableref"xTable":key"currentKey":data"pageData?.list || []"show-head…

Flutter 中的 MergeableMaterial 小部件:全面指南

Flutter 中的 MergeableMaterial 小部件&#xff1a;全面指南 Flutter 提供了丰富的 Material Design 组件&#xff0c;用于构建具有丰富交互和视觉效果的用户界面。MergeableMaterial 是 Flutter 中一个特殊的组件&#xff0c;它允许多个 Material widget&#xff08;如按钮、…

2024-5-25

今日安排&#xff1a; 前面的状态不太好&#xff0c;后面一定要好好调整 重新开始审计 nf_tables 源码&#xff0c;并在审计的过程中复现历史漏洞【 && iptables 相关学习】♥♥♥♥♥复现 CTF 相关题目♥♥♥♥学习 winpwn♥♥♥♥mount 的使用&#xff0c;学习 nam…

js 根据日期获取星期几

js 根据日期获取星期几 方法一&#xff1a;使用Date对象中的getDay()方法 function getWeekday(dateStr) {const weekDays [星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六];const date new Date(dateStr);const weekday date.getDay();return weekDays[weekday…

MySQL造数据占用临时表空间

在数据库性能测试和开发过程中&#xff0c;常常需要生成大量的测试数据以模拟真实环境。在MySQL中&#xff0c;造数据的过程可能会占用大量的临时表空间&#xff0c;这可能会影响数据库的性能和稳定性。本文将深入探讨MySQL造数据时临时表空间的使用情况&#xff0c;并通过多个…

GolangFoundation

GolangFoundation 一. Hello World1.1 SDK1.2 环境1.3 hello world1.4 语法规则二. 变量2.1 变量声明与定义一. Hello World 1.1 SDK https://golang.google.cn/dl/下载最新版1.2 环境 GoGOROOT D:\Dev\

家政项目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 …