【栈和队列】栈和队列的相互实现OJ练习【力扣-232、力扣-225】超详细的保姆级别解释
【栈和队列】栈和队列的相互实现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】超详细的保姆级别解释的更多相关文章
- 算法(第四版)C# 习题题解——1.3.49 用 6 个栈实现一个 O(1) 队列
因为这个解法有点复杂,因此单独开一贴介绍. 那么这里就使用六个栈来解决这个问题. 这个算法来自于这篇论文. 原文里用的是 Pure Lisp,不过语法很简单,还是很容易看懂的. 先导知识——用两个栈模 ...
- YTU 3002: 出栈顺序(栈和队列)
3002: 出栈顺序(栈和队列) 时间限制: 1 Sec 内存限制: 128 MB 提交: 80 解决: 20 题目描述 给出一个入栈序列,和一个出栈序列,判断该出栈序列是否正确. 输入 输入包含 ...
- 两个栈实现队列+两个队列实现栈----java
两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后所有出s ...
- 二、 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek)
请指教交流! package com.it.hxs.c01; import java.util.Stack; /* 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek) */ ...
- 两个队列实现栈&两个栈实现队列(JAVA)
1,两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路:栈的特点时先进后出,队列的特点是先进先出. 若此时有两个队列stack1,st ...
- 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...
- 【12】python 栈型数据结构模拟、队列型数据结构模拟
一.压栈操作模拟 #__author:"吉*佳" #date: 2018/10/21 0021 #function:栈 # 栈:即是先进后出的一种数据结构 # (1)模拟压栈操作 ...
- Stack栈类与、Queue队列与线性表的区别和联系
栈和队列都属于特殊的线性表 一.定义 1.线性表(linear list): 是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列.数据元素是一个抽象的符号,其具体含义在不同的情 ...
- 数据结构&算法(一)_堆、栈(堆栈)、队列、链表
堆: ①堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值: ·堆总是一棵完全二叉树.将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做 ...
- java成神之——集合框架之队列,栈,集合并发
集合 队列和双端队列 PriorityQueue Deque BlockingQueue Queue 栈 集合并发 线程锁 线程安全集合 结语 集合 队列和双端队列 PriorityQueue 此队列 ...
随机推荐
- Codeforces Round #721 (Div. 2) AB思维,B2博弈,C题map
补题链接:Here 1527A. And Then There Were K 题目大意: 给一个正整数n,求最大的k,使得 \(n \& (n−1) \& (n−2) \& ( ...
- 【驱动】I2C驱动分析(二)-驱动框架
I2C驱动框架简介 I2C 驱动属于总线-设备-驱动模型的,与I2C总线设备驱动模型相比,大体框架是一样,系统的整体框架如下所示. 最上层是应用层,在应用层用户可以直接用open read write ...
- opensips简介
概述 在众多的sip服务器中,主要有俩大类,一类侧重于媒体/业务服务器,比如freeswitch/asterisk,另一类侧重于代理/负载服务器,比如opensips/kamailio. 今天我们对o ...
- C++ 覆盖写文件
写文件有三种模式: 截断写,文件打开之后立即清空原有内容 附加写,文件打开之后不清空原有内容,每次只能在文件最后写入 覆盖写,文件打开之后不清空原有内容,可以在文件任意位置写入 例如:文件原有内容为 ...
- 使用WTM框架创建博客系统后台并在云服务器发布
阅读导航 关于lqclass.com 博客后台前后端部署 2.1 已部署访问链接 2.2 nginx 部署 2.2.1 后台后端发布 2.2.2 后台前端发布 2.2.3 云服务器部署 下次分享 1. ...
- 06-Shell内置命令
1.内置命令介绍 Shell 内置命令,就是由 Bash Shell 自身提供的命令,而不是文件系统中的可执行文件. 使用type 来确定一个命令是否是内置命令: type 命令 通常来说,内置命令会 ...
- 【MicroPython】生成micropython版本头文件 - py\makeversionhdr.py
用法 $ python makeversionhdr.py mpversion.h 实现 带git仓 get_version_info_from_git 使用git指令: git describe ...
- [粘贴]TiFlash
TiFlash 是 TiDB HTAP 形态的关键组件,它是 TiKV 的列存扩展,在提供了良好的隔离性的同时,也兼顾了强一致性.列存副本通过 Raft Learner 协议异步复制,但是在读取的时候 ...
- firewall-cmd 命令简单总结
最近进行相关网络设置, 发现需要总结一下不然总是会忘记. # 1. 开放IP地址访问 firewall-cmd --zone=trusted --add-source=yourip --permane ...
- React中事件的绑定
事件绑定 语法:on +事件名= { ()=>{ do something }} <!-- 点击事件 --> onClick={ () => { } } 注意的是:React采 ...

