当前位置: 首页 > news >正文

栈与队列|232.用栈实现队列

力扣题目链接

class MyQueue {
public:stack<int> stIn;stack<int> stOut;/** Initialize your data structure here. */MyQueue() {}/** Push element x to the back of queue. */void push(int x) {stIn.push(x);}/** Removes the element from in front of queue and returns that element. */int pop() {// 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据)if (stOut.empty()) {// 从stIn导入数据直到stIn为空while(!stIn.empty()) {stOut.push(stIn.top());stIn.pop();}}int result = stOut.top();stOut.pop();return result;}/** Get the front element. */int peek() {int res = this->pop(); // 直接使用已有的pop函数stOut.push(res); // 因为pop函数弹出了元素res,所以再添加回去return res;}/** Returns whether the queue is empty. */bool empty() {return stIn.empty() && stOut.empty();}
};

如果你画一下图,那应该很好理解。

c语言代码如下:

/*
1.两个type为int的数组(栈),大小为100第一个栈stackIn用来存放数据,第二个栈stackOut作为辅助用来输出数据
2.两个指针stackInTop和stackOutTop,分别指向栈顶
*/
typedef struct {int stackInTop, stackOutTop;int stackIn[100], stackOut[100];
} MyQueue;/*
1.开辟一个队列的大小空间
2.将指针stackInTop和stackOutTop初始化为0
3.返回开辟的队列
*/
MyQueue* myQueueCreate() {MyQueue* queue = (MyQueue*)malloc(sizeof(MyQueue));queue->stackInTop = 0;queue->stackOutTop = 0;return queue;
}/*
将元素存入第一个栈中,存入后栈顶指针+1
*/
void myQueuePush(MyQueue* obj, int x) {obj->stackIn[(obj->stackInTop)++] = x;
}/*
1.若输出栈为空且当第一个栈中有元素(stackInTop>0时),将第一个栈中元素复制到第二个栈中(stackOut[stackTop2++] = stackIn[--stackTop1])
2.将栈顶元素保存
3.当stackTop2>0时,将第二个栈中元素复制到第一个栈中(stackIn[stackTop1++] = stackOut[--stackTop2])
*/
int myQueuePop(MyQueue* obj) {//优化:复制栈顶指针,减少对内存的访问次数int stackInTop = obj->stackInTop;int stackOutTop = obj->stackOutTop;//若输出栈为空if(stackOutTop == 0) {//将第一个栈中元素复制到第二个栈中while(stackInTop > 0) {obj->stackOut[stackOutTop++] = obj->stackIn[--stackInTop];}}//将第二个栈中栈顶元素(队列的第一个元素)出栈,并保存int top = obj->stackOut[--stackOutTop];//将输出栈中元素放回输入栈中while(stackOutTop > 0) {obj->stackIn[stackInTop++] = obj->stackOut[--stackOutTop];}//更新栈顶指针obj->stackInTop = stackInTop;obj->stackOutTop = stackOutTop;//返回队列中第一个元素return top;
}//返回输入栈中的栈底元素
int myQueuePeek(MyQueue* obj) {return obj->stackIn[0];
}//若栈顶指针均为0,则代表队列为空
bool myQueueEmpty(MyQueue* obj) {return obj->stackInTop == 0 && obj->stackOutTop == 0;
}//将栈顶指针置0
void myQueueFree(MyQueue* obj) {obj->stackInTop = 0;obj->stackOutTop = 0;
}

一、出错点

1.不熟悉c++的STL容器

二、理解后的思路

这题你画两个栈就很好理解了

这是一道模拟题,不涉及到具体算法,考察的就是对栈和队列的掌握程度。

使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈和输出栈的关系。

下面动画模拟以下队列的执行过程:

执行语句:
queue.push(1);
queue.push(2);
queue.pop(); 注意此时的输出栈的操作
queue.push(3);
queue.push(4);
queue.pop();
queue.pop();注意此时的输出栈的操作
queue.pop();
queue.empty();

代码随想录 (programmercarl.com)

在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。

最后如何判断队列为空呢?如果进栈和出栈都为空的话,说明模拟的队列为空了。

在代码实现的时候,会发现pop() 和 peek()两个函数功能类似,代码实现上也是类似的,可以思考一下如何把代码抽象一下。

三、总结

要熟悉栈与队列的基本操作,多敲代码多练习!

相关文章:

  • 音频数据如果在中断中会随机给的那就放入队列或者缓冲区;队列缓冲区对音频的作用
  • RabbitMQ基础
  • 在 Mac 上通过“启动转换助理”安装 Windows 10
  • swiftUI中的可变属性和封装
  • huawei services HK华为云服务
  • mysql启动报错:ERROR! The server quit without updating PID file
  • 从0开始回顾MySQL --- 三范式与表设计
  • 腾讯云对象存储的在Java使用步骤介绍
  • Vue学习日记 Day7 —— json-server工具、基于VueCli自定义创建项目、postcss插件
  • C语言中volatile关键字的用法
  • 华为配置敏捷分布式SFN漫游实验
  • 【Golang】golang使用三方SDK操作容器指南
  • 爬虫(五)
  • 面向对象编程第二式:继承 (Java篇)
  • oppo前端开发一面
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Angular2开发踩坑系列-生产环境编译
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • download使用浅析
  • Git同步原始仓库到Fork仓库中
  • Java到底能干嘛?
  • JS基础之数据类型、对象、原型、原型链、继承
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • redis学习笔记(三):列表、集合、有序集合
  • SQL 难点解决:记录的引用
  • 大整数乘法-表格法
  • 记录:CentOS7.2配置LNMP环境记录
  • 近期前端发展计划
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 以太坊客户端Geth命令参数详解
  • 自制字幕遮挡器
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • UI设计初学者应该如何入门?
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • #NOIP 2014# day.2 T2 寻找道路
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (2)STL算法之元素计数
  • (AngularJS)Angular 控制器之间通信初探
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (循环依赖问题)学习spring的第九天
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)为C# Windows服务添加安装程序
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .axf 转化 .bin文件 的方法
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET Core 版本不支持的问题
  • .NET 反射的使用
  • .net 托管代码与非托管代码