【栈和队列】栈和队列的相互实现OJ练习【力扣-232、力扣-225】超详细的保姆级别解释

先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我哦!️️️

本篇建议收藏后食用~

这边博主提供力扣答题的传送门,大家食用完文章可以通过传送门答题:

OJ练习1:力扣225. 用队列实现栈
OJ练习2:力扣232. 用栈实现队列

还没有学习栈和队列相关内容的伙伴们,可以通过传送门食用先做了解哦:【栈和队列】纯C实现栈和队列以及其基本操作-宝藏级别数据结构教程【保姆级别详细教学】

OJ232 用栈实现队列

题目描述

解题思路和代码实现

我们都知道,栈是只能在一端操作的。
而与此同时,队列是一头出一头入的。

push()我们肯定没问题,直接push进去就可以了。
主要是pop()
基于这两个性质,我们用栈实现队列的时候,我们可以定义两个栈,一个用来入数据stIn,一个用来出数据stOut。这样,我们入数据时入到stIn里面,出数据的时候先将stIn里面的内容移动到stOut里面后再出即可。
即如动画所示:
gif取自百度

有了这个思路,我们就可以轻易的写出代码了

//用栈实现队列
//pop():弹出队头元素
//peek():获取队头元素
//push():队尾插入元素
//empty():验空
class MyQueue {
public:
stack<int>stIn;//输入栈
stack<int>stOut;//输出栈
MyQueue() { }
//进数据的时候直接进就可以了
void push(int x) {
stIn.push(x);
}
int pop() {
//只有当stOut为空的时候,才能从stIn中导入数据(导入stIn的全部数据)
while (!stIn.empty()) {//将IN的数据倒入OUT里面,知道stIn为空
stOut.push(stIn.top());
stIn.pop();
}
int ret = stOut.top();
stOut.pop();
return ret;
}
//获取头部元素
int peek() {
int res = this->pop();//直接使用已经有了的pop函数
stOut.push(res);
return res;
}
bool empty() {
return stIn.empty() && stOut.empty();
}
};

OJ225 用队列实现栈

题目描述

用两个队列实现栈

思路:
push()我们肯定没问题,直接push进去就可以了。
主要是pop()
这一题我们用两个队列的时候,其作用就不像上一题一样了,另外一个队列是一个临时空间而已,当我们要弹出最先进去的数字时,由于栈的性质,这个数应该在最下面,所以我们在队列里要把前面那些先临时放到一边先,然后再把最后面那个弹出去。这才是实现栈。

有了这个思路,我们就可以很轻易的实现栈了。

//用队列实现栈
//这个思路和上面那个是完全不一样的
//我们如果用两个队列来实现栈的话
//第二个队列是完全用来备份数据的,也就是想弹出一个数字时,前面挡住的全部
//备份,pop完再放回去
class MyStack1 {
public:
queue<int> que1;
queue<int> que2;//pop时备份数据
MyStack1() { }
void push(int x) {
que1.push(x);
}
int pop() {
int size = que1.size();
size--;
while (size--) {
que2.push(que1.front());//按顺序一个一个放到que2里面去
que1.pop();
} int ret = que1.front();//留下的那个就是要弹出去的值
que1.pop();
que1 = que2;//再将que2的值直接赋给que1
while (!que2.empty()) {
que2.pop();//清空que2
}
return ret;
}
int top() {
return que1.back();//top对于栈来说是压栈那一边,所以是队列的back()
}
bool empty() {
return que1.empty();
}
};

用一个队列实现栈

同样是pop()的问题:
这一次,我们只有一个队列,我们不备份了,前面挡住的直接重新pop()后直接放到原队列后面去,像绕圈圈一样,等真正要pop()的那个数据暴露出来后,再真正的pop()出来。
其实思路挺容易明白的

//只用一个队列的思路就是,pop()的时候把前面挡住的弹出来再放到后面去跟着
//就是围一个圈圈
class MyStack {
public:
queue<int>que;
MyStack() { }
//直接push()即可
void push(int x) {
que.push(x);
}
int pop() {
int size = que.size();
size--;//这个的作用就是留下一个真正要pop()的
while (size--) {
que.push(que.front());//一定要先压进去再pop掉,否则数据就丢了
que.pop();
}
int ret = que.front();
que.pop();
return ret;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};

尾声

看到这里,相信你已经拿捏这两道经典OJ了,虽然它们难度不高,但是做为经典题,它的思路是值得我们学习的。
在走之前,如果感觉这篇博客对你有帮助的话,别忘了收藏点赞关注我哦!

【栈和队列】栈和队列的相互实现OJ练习【力扣-232、力扣-225】超详细的保姆级别解释的更多相关文章

  1. 算法(第四版)C# 习题题解——1.3.49 用 6 个栈实现一个 O(1) 队列

    因为这个解法有点复杂,因此单独开一贴介绍. 那么这里就使用六个栈来解决这个问题. 这个算法来自于这篇论文. 原文里用的是 Pure Lisp,不过语法很简单,还是很容易看懂的. 先导知识——用两个栈模 ...

  2. YTU 3002: 出栈顺序(栈和队列)

    3002: 出栈顺序(栈和队列) 时间限制: 1 Sec  内存限制: 128 MB 提交: 80  解决: 20 题目描述 给出一个入栈序列,和一个出栈序列,判断该出栈序列是否正确. 输入 输入包含 ...

  3. 两个栈实现队列+两个队列实现栈----java

                                               两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后所有出s ...

  4. 二、 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek)

    请指教交流! package com.it.hxs.c01; import java.util.Stack; /* 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek) */ ...

  5. 两个队列实现栈&两个栈实现队列(JAVA)

    1,两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路:栈的特点时先进后出,队列的特点是先进先出. 若此时有两个队列stack1,st ...

  6. 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...

  7. 【12】python 栈型数据结构模拟、队列型数据结构模拟

    一.压栈操作模拟 #__author:"吉*佳" #date: 2018/10/21 0021 #function:栈 # 栈:即是先进后出的一种数据结构 # (1)模拟压栈操作 ...

  8. Stack栈类与、Queue队列与线性表的区别和联系

    栈和队列都属于特殊的线性表   一.定义   1.线性表(linear list): 是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列.数据元素是一个抽象的符号,其具体含义在不同的情 ...

  9. 数据结构&算法(一)_堆、栈(堆栈)、队列、链表

    堆: ①堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值: ·堆总是一棵完全二叉树.将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做 ...

  10. java成神之——集合框架之队列,栈,集合并发

    集合 队列和双端队列 PriorityQueue Deque BlockingQueue Queue 栈 集合并发 线程锁 线程安全集合 结语 集合 队列和双端队列 PriorityQueue 此队列 ...

随机推荐

  1. 打破监控壁垒,棉花厂3D可视化建设让生产加工更加智能化

    前言 现在的棉花加工行业还停留在传统的反应式维护模式当中,当棉花加下厂的设备突然出现故障时,控制程序需要更换.这种情况下,首先需要客户向设备生产厂家请求派出技术人员进行维护,然后生产厂家才能根据情况再 ...

  2. Django 对实体的增删改查样例

    class UserInfo(models.Model): """ 人员信息 """ user_id = models.CharField( ...

  3. vue-cli3开启gzip压缩

    首先添加yarn add 插件 "compression-webpack-plugin" 然后在vue.config.js里引入 在configureWebpack里增加插件代码. ...

  4. 一文搞清楚Java中的包、类、接口

    写在开头 包.类.接口.方法.变量.参数.代码块,这些都是构成Java程序的核心部分,即便最简单的一段代码里都至少要包含里面的三四个内容,这两天花点时间梳理了一下,理解又深刻了几分. Java中的包 ...

  5. steam无法登陆/更新客户端

    1.问题 最近CS2更新,正准备尝试游玩一下,发现提示要使用最新版本客户端,在检查steam客户端更新时,却发现检查更新失败,无法更新,有可能是丢失了某些文件导致的. (之前有过一次重新安装的经历,但 ...

  6. IBM java的分析工具(ga和ha)学习和整理

    IBM java的分析工具(ga和ha)学习和整理 背景 前几天学习了整理了 jca 工具 今天继续学习一下 ga工具 ga 工具主要是分析gclog相关. 可以很直观的进行gclog的分析和展示. ...

  7. [转帖]解Bug之路-NAT引发的性能瓶颈

    https://zhuanlan.zhihu.com/p/286532997 解Bug之路-NAT引发的性能瓶颈 笔者最近解决了一个非常曲折的问题,从抓包开始一路排查到不同内核版本间的细微差异,最后才 ...

  8. [转帖]grafana自定义告警模版

     发表于 2022-03-16  更新于 2023-03-03 因 grafana 告警信息太多无用数据,容易干扰查看例如使用 企业微信告警消息如下太多无用Labels 例如 endpoint,job ...

  9. 【转帖】【漏洞提示】MySQL8.0.29因重大bug官网已下架

    前阵子,MySQL官网已经将 MySQL 8.0.29版本下架.据悉下架原因是由于MySQL 8.0.29 存在关于InnoDB解释器的重大Bug.而最新版本 8.0.30及以上的版本已修复此漏洞.各 ...

  10. [转帖]如何理解 iowait

    Linux中,%iowait 过高可能是个问题,严重的时候,它能使服务停止, 但问题是,多高才算高? 什么时候应该担心呢? 本文将讨论 iowait 的含义.相关的统计数据.原理以及 iowait的瓶 ...