刷题笔记——栈和队列互相冒充

刷题笔记——栈和队列互相冒充

    • 5.3 用队列实现栈
      • 两队列实现栈
      • 一个队列实现栈
    • 5.4 用栈实现队列
      • 两栈实现队列
      • push栈和pop栈
      • 一个栈实现队列

5.3 用队列实现栈

原OJ题:225. 用队列实现栈 - 力扣(LeetCode)
请添加图片描述

两队列实现栈

  1. 入栈的实现

选非空的队列进行push,两个都空的话随便选。

  1. 出栈的实现和返回栈顶元素

假设我们有两个队列1、2。

若1队列非空,2队列为空,则1队列除了队尾全部转移到2队,1队仅剩的1个元素即为目标元素。

随着操作次数变多,我们可能会忘了哪个队列为空。此时需要假设一个队列为空,再去验证该队列是否为空。

  1. 判断队列是否为空

两个队列都没有数据时,栈才算为空。

为节省篇幅,这里用STL来模拟相应的数据结构。

参考程序:

#include<queue>
using namespace std;class MyStack {
public:MyStack() {size=0;}void push(int x) {//入栈if(!q2.empty()){q2.push(x);size++;}else{q1.push(x);size++;}}int pop() {//假设队列q1为空queue<int>*emptyQ=&q1,*noEmptyQ=&q2;if(!(*emptyQ).empty()){emptyQ=&q2;noEmptyQ=&q1;}//将非空队列的数据转移到空队列while((*noEmptyQ).size()>1){(*emptyQ).push((*noEmptyQ).front());(*noEmptyQ).pop();}int t=(*noEmptyQ).front();//获取栈顶元素(*noEmptyQ).pop();size--;return t;}int top() {//这里的操作和pop函数是一样的queue<int>*emptyQ=&q1,*noEmptyQ=&q2;if(!(*emptyQ).empty()){emptyQ=&q2;noEmptyQ=&q1;}while((*noEmptyQ).size()>1){(*emptyQ).push((*noEmptyQ).front());(*noEmptyQ).pop();}int t=(*noEmptyQ).front();(*noEmptyQ).pop();(*emptyQ).push(t);return t;}bool empty() {return size==0;}
private:queue<int>q1,q2;int size;
};/*** Your MyStack object will be instantiated and called as such:* MyStack* obj = new MyStack();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->top();* bool param_4 = obj->empty();*/

一个队列实现栈

假设我们只有一个队列q。

思路:

  1. 入栈

假设我们要将数据x入队。

若队列q为空,则x正常入队。

若队列有数据,则先标记队列内的元素长度,再将x入队,最后将除了x的数据全部进行先出队再入队的操作,保证队首始终为后进的元素。

  1. 出栈和获取栈顶元素

队列正常弹出队首即可。

  1. 判断栈是否为空

直接判断队列是否为空即可。

参考程序:

#include<queue>
using std::queue;class MyStack {
public:void push(int x) {int num=q.size();//获取当前队列元素个数q.push(x);while(num--){//除了x都进行一次排队的操作int t=q.front();q.pop();q.push(t);}}//之后都是正常队列的操作int pop() {int t=q.front();q.pop();return t;}int top() {int t=q.front();return t;}bool empty() {return q.empty();}
private:queue<int>q;
};/*** Your MyStack object will be instantiated and called as such:* MyStack* obj = new MyStack();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->top();* bool param_4 = obj->empty();*/

5.4 用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode)
请添加图片描述

两栈实现队列

模仿两队列实现栈的思路。

参考程序:

#include<stack>
using std::stack;class MyQueue {
public:MyQueue() {size=0;}void push(int x) {if(!s2.empty()){s2.push(x);size++;}else{s1.push(x);size++;}}int pop() {//找出空栈stack<int>*emptyS=&s1,*noEmptyS=&s2;if(!(*emptyS).empty()){emptyS=&s2;noEmptyS=&s1;}//获取栈顶元素while((*noEmptyS).size()>1){(*emptyS).push((*noEmptyS).top());(*noEmptyS).pop();}int t=(*noEmptyS).top();(*noEmptyS).pop();//这步使非空栈变为空size--;return t;}int peek() {stack<int>*emptyS=&s1,*noEmptyS=&s2;if(!(*emptyS).empty()){emptyS=&s2;noEmptyS=&s1;}while((*noEmptyS).size()>1){(*emptyS).push((*noEmptyS).top());(*noEmptyS).pop();}int t=(*noEmptyS).top();while((*emptyS).size()){//因为没有进行pop操作,需要将数据放回原栈(*noEmptyS).push((*emptyS).top());(*emptyS).pop();}return t;}bool empty() {return size==0;}
private:stack<int>s1,s2;int size;
};/*** Your MyCircularQueue object will be instantiated and called as such:* MyCircularQueue* obj = new MyCircularQueue(k);* bool param_1 = obj->enQueue(value);* bool param_2 = obj->deQueue();* int param_3 = obj->Front();* int param_4 = obj->Rear();* bool param_5 = obj->isEmpty();* bool param_6 = obj->isFull();*/

push栈和pop栈

  1. 入队

一个栈用于实现数据入队操作,记为ins栈;另一个栈用于实现出队操作,记为outs栈。

  1. 出队

outs栈为空,则ins栈的数据全部压入outs栈再pop;

outs栈非空,直接出栈即可。

  1. 获取队首元素

套用出栈的思路即可。

或将出栈获取栈顶元素的步骤用于获取栈顶元素的函数的实现,出栈的函数调用获取栈顶元素的函数即可。

  1. 判断队列是否为空

两个栈都为空,队列则为空。

参考程序:

class MyQueue {//一个栈用于push,一个栈用于pop
public:MyQueue() {size=0;}void push(int x) {//入栈ins.push(x);size++;}int pop() {//出栈int t=this->peek();outs.pop();size--;return t;}int peek() {//获取栈顶元素if(outs.empty()){while(ins.size()>1){outs.push(ins.top());ins.pop();}int t=ins.top();ins.pop();outs.push(t);//到这里,ins栈为空return t;}return outs.top();}bool empty() {return size==0;}
private:stack<int>ins,outs;int size;
};

一个栈实现队列

原则上一个栈是不可能实现完整的队列操作,至少需要两个栈。

但我们可以利用栈的特性,通过递归来暂时替代另一个栈的功能。

  1. 入队

假设元素x为入队的元素。

若栈内没有元素,则x直接入栈。

若栈内有元素,则先取出栈顶元素进行保存,之后进行递归。直到栈空时,将x入栈。之后回溯的过程中将通过递归保存的数据重新放回栈。

  1. 出队

正常弹出栈顶元素即可。

  1. 获取队首元素

正常返回栈顶元素即可。

  1. 判断队列是否为空

栈为空,队列则为空。

这里入队的每层递归时间复杂度都为 O ( 1 ) O(1) O(1),所有的 n n n个数据都进行一次递归的话,时间复杂度为 O ( n ) O(n) O(n)

参考程序:

#include<stack>
using std::stack;class MyQueue {
public:void push(int x) {//栈为空则x入栈if(sk.empty()){sk.push(x);return;}int t=sk.top();sk.pop();push(x);sk.push(t);//回溯操作其实也用到了系统自带的栈}int pop() {int t=sk.top();sk.pop();return t;}int peek() {int t=sk.top();return t;}bool empty() {return sk.empty();}
private:stack<int>sk;
};/*** Your MyQueue object will be instantiated and called as such:* MyQueue* obj = new MyQueue();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->peek();* bool param_4 = obj->empty();*/

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】网络编程3

文件描述符的作用 在TCP通信的过程&#xff0c;服务器端会产生两类不同的文件描述符&#xff0c;一个是监听的文件描述符&#xff1b;另一个是用于通信的文件描述符。它们有什么不同呢&#xff1f; 监听的文件描述符&#xff1a; 只有一个&#xff0c;它不负责与客户端的通信&…

番外-JDBC:2024年最新java连接数据库教程

前言 JavaScript的内容晚点更新&#xff0c;今天继续更新一点番外&#xff0c;今天更新的是jdbc&#xff0c;如何用java连接数据库 1.导包 要使java能够连接数据库我们需要导入一个包&#xff0c;请按照以下操作安装并导包 1.进入官网 MySQL 以上为官网链接进去后点击下载…

LIMA模型——大模型对齐的新方法

人工智能咨询培训老师叶梓 转载标明出处 大模型通常在两个阶段进行训练&#xff1a;首先是从原始文本中进行无监督预训练&#xff0c;以学习通用表示&#xff1b;其次是通过大规模的指令微调和强化学习&#xff0c;以更好地适应最终任务和用户偏好。来自Meta AI、卡内基梅隆大…

向量数据库PGVECTOR安装

文章目录 前提向量数据库介绍PGVECTOR安装1、pgvector下载2、编译安装3、创建vector扩展 前提 已经安装好了pg14版本。 其他版本也可以。 pg安装教程&#xff1a;https://blog.csdn.net/yushaoyyds/article/details/138855306?spm1001.2014.3001.5502 向量数据库介绍 向量数…

Spring Boot框架助力电商系统设计

2 相关技术 2.1 SpringBoot框架介绍 Spring Boot是一种不需要代码生成的一种框架&#xff0c;并且可以不需要配置任何的XML文件就可以&#xff0c;因为Spring Boot里面自带了很多接口&#xff0c;只需要配置不同的接口就会自动的应用并且识别需要的依赖&#xff0c;在配置方面非…

双十一之夜:珠海体育中心悲剧,极端行为下的反思

双十一&#xff0c;这个原本充满购物狂欢与期待的节日&#xff0c;在珠海市香洲区的珠海市体育中心&#xff0c;被一场突如其来的极端事件所笼罩&#xff0c;让欢乐的氛围即刻凝固。62岁男子的一时冲动&#xff0c;驾车冲撞行人&#xff0c;导致35条宝贵生命戛然而止&#xff0…

常用环境部署(二十三)——Docker部署ERPNext

1、介绍 ERPNext 是一种业务财务集成一体的现代管理关键。 与传统会计和 ERP 相比&#xff0c;它具有许多优势。相对于传统记账软件的优势: ​不仅仅是会计&#xff01; 管理库存、账单、报价、销售线索、工资单等。所有数据存放在同一个地方安全存储&#xff0c; 所有用户都在…

黑马程序员——Vue3小兔鲜项目(5. Home页)

静态结构搭建和分类实现 1. 整体结构创建 1- 按照结构新增五个组件&#xff0c;准备最简单的模版&#xff0c;分别在Home模块的入口组件中引入 HomeCategoryHomeBannerHomeNewHomeHotHomeProduct <script setup> </script><template><div> HomeCate…

nginx部署H5端程序与PC端进行区分及代理多个项目及H5内页面刷新出现404问题。

在项目中会碰见需要在nginx代理多个项目&#xff0c;如果在加上uniapp开发的H5端的项目&#xff0c;你还要在nginx中区分PC端和手机H5端&#xff0c;这就会让人很头大&#xff01;网上大部分的资料都是采用在nginx的conf配置文件中添加区分pc和手机端的变量例如&#xff1a;set…

【miniMax开放平台-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

除了 Postman,还有什么好用的 API 调试工具吗

尽管 Postman 拥有团队协作等实用特性&#xff0c;其免费版提供的功能相对有限&#xff0c;而付费版的定价可能对小团队或个人开发者而言显得偏高。此外&#xff0c;Postman 的访问速度有时较慢&#xff0c;这可能严重影响使用体验。 鉴于这些限制&#xff0c;Apifox 成为了一…

缓存(四)指标

这张图总结了缓存性能的三个主要指标&#xff1a;未命中率&#xff08;Miss Rate&#xff09;、命中时间&#xff08;Hit Time&#xff09; 和 未命中惩罚&#xff08;Miss Penalty&#xff09;。这些指标用于评估缓存系统的效率和性能。 1. 未命中率&#xff08;Miss Rate&am…

AI赋能电商:提升用户体验与销售效率的创新应用与未来展望

目录 前言1. AI在电商中的核心应用领域1.1 智能购物推荐1.2 精准的会员分类1.3 智能定价系统1.4 提升用户体验的智能客服系统 2. AI应用中的挑战与应对策略2.1 数据安全与隐私保护2.2 算法的公平性与透明度 3. AI在电商行业的未来发展趋势3.1 虚拟购物助手与元宇宙体验3.2 基于…

苹果音乐因为忘记续期,禁用了自己服务器...

我在《从零开始搭建博客》中有提到如何续费 SSL 证书&#xff0c;以及如何自动续费。当时我只是顺带提一嘴&#xff0c;没想到这么快&#xff0c;就有大厂因为忘记续费证书了… 然后&#xff0c;苹果是第一个被打脸的&#xff0c;忘记续期了&#xff0c;而且影响是非常重要的 …

CACTER诚邀您参加2024高交会

11月14-16日 第二十六届中国国际高新技术成果交易会 于深圳国际会展中心&#xff08;宝安&#xff09; 隆重开幕 CACTER于12号馆D12展位诚邀各位莅临 关于高交会 中国国际高新技术成果交易会&#xff08;简称“高交会”&#xff09;由深圳市人民政府主办&#xff0c;是目前…

微信多账号管理,让你的管理更轻松,效率更高!

现在微信账号越来越多&#xff0c;工作生活里头的微信一多&#xff0c;管理起来就头疼。各种消息、好友请求、群发消息一大堆&#xff0c;手忙脚乱的。 这时候&#xff0c;有个给力的微信管理工具就太重要了&#xff0c;它能帮你搞定社交&#xff0c;管理起来也轻松。 先说说…

Unity图形学之Shader2.0 OutLine实例

1.轮廓&#xff1a; &#xff08;1&#xff09;直接 渲染两个物体&#xff1a;一个大 一个小&#xff0c;大的是轮廓&#xff0c;直接返回一个颜色&#xff1b;小的物体按照纹理采样返回颜色 两个Pass { } 第一个Pass 渲染大的物体边缘第二个Pass 渲染小的物品 Shader "…

基于Springboot+微信小程序的农产品销售小程序 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

LabVIEW大数据处理

在物联网、工业4.0和科学实验中&#xff0c;大数据处理需求逐年上升。LabVIEW作为一款图形化编程语言&#xff0c;凭借其强大的数据采集和分析能力&#xff0c;广泛应用于实时数据处理和控制系统中。然而&#xff0c;在面对大数据处理时&#xff0c;LabVIEW也存在一些注意事项。…

OLED 显示画面的变换操作——上下、左右翻转

OLED 画面旋转 OLED 写入函数定义 OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常OLED 显示界面转换函数如下 void OLED_DisplayTurn(u8 i) {if(i0…