【栈和队列】栈和队列的相互实现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. Educational Codeforces Round 93 (Rated for Div. 2)

    Educational Codeforces Round 93 (Rated for Div. 2) A. Bad Triangle input 3 7 4 6 11 11 15 18 20 4 10 ...

  2. springboot启动类源码探索一波

    举个例子:  这是一个原始的Spring IOC容器启动方法,我们需要AnnotationConfigApplicationContext这个类有如下几个步骤 1. 创建构造方法,根据我们所传入的Ap ...

  3. SpringCloud学习 系列十、服务熔断与降级(2-方法级别服务降级)

    系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...

  4. Java标签在循环中的使用

    定义 标签,类似--label1: 放在循环外部,用于内部多重循环语句的跳出 例子 public static void main(String[] args) { Scanner sc = new ...

  5. 【C/C++】输出文件的相对路径

    FILE 在有些编译器上会输出带路径的文件名,删除路径可使用函数 strrchr #include <string.h> #include <stdio.h> #define ...

  6. 【MCU】单片机如何检测市电通断?(应用甚广~)

    [来源]https://mp.weixin.qq.com/s/TQKtEbxS8WSo3D1MecdMIw

  7. MySQL高可用九种方案

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 参考视频 MMM 方案(单主) MySQL 高可用方案之 MM ...

  8. [转帖]mysql8 ALGORITHM=INSTANT 亿级数据秒速增加字段

    一.概述 登录后复制 在线DDL之快速增加列(秒级别的),并不会造成业务抖动.该功能自 MySQL 8.0.12 版本引入,是由腾讯游戏DBA团队贡献,此功能只适用于 InnoDB 表.实际上MySQ ...

  9. [转帖]kingbase(人大金仓)的一些常用表操作语句

    包括 1)创建表 2)删除表 3)加字段 4)字段换名 5)字段改类型 6)字段添加注释 7)修改字段为自增类型 8)增加主键 9)查看模式下的表 一.创建和删除表 DROP TABLE IF EXI ...

  10. [转帖]修改jmeter内存配置(win&mac&linux)

    目录 一.背景: 二.win环境下修改jmeter内存 三.mac&linux环境下修改jmeter内存 四.验证内存是否修改成功 一.背景: 在进行大数据.高并发压测的过程性,有时会遇上JM ...