C/C++面试题—使用STL两个队列实现一个栈
题目介绍
使用STL中的两个队列实现一个栈,实现栈的top、pop、push、clear等操作。
思路分析
思路和使用2个栈实现一个队列是相通的,用一个队列queue1容器用来 压栈,出栈的时候判断queue1.size()是否大于1,大于1的话队尾元素是栈顶需要弹出,这时就用到了queue2,将queue1其他的元素倒腾到queue2中,queue1中剩下的那一个元素就是栈顶的元素了。下次再继续出栈,如果queue1中没有元素 就判断queue2中的元素,queue2的队尾为栈顶,将其他元素倒腾到queue1中。
代码展示
/*使用STL,用两个队列来实现一个栈,完成栈的push,pop,top,clear
*/
#include <queue>
#include <stack>
#include <iostream>
using namespace std;template<typename T> class MyStack
{
public:void clear(){if (queue1.size() > 0)queue1.swap(queue<T>());if (queue2.size() > 0)queue2.swap(queue<T>());}T top() //栈顶就是 队列的最后一个元素,和pop函数十分类似{while (queue1.size() > 1)//queue1的队尾元素是栈顶元素,将其余的倒腾到queue2中去{T front = queue1.front();queue1.pop();queue2.push(front);}if (queue1.size() == 1){T front = queue1.front();//queue1.pop();return front;}while (queue2.size() > 1)//queue1没有元素,queue2有元素,queue2的队尾为栈顶元素,将其余的倒腾到queue1中去{T front = queue2.front();queue2.pop();queue1.push(front);}if (queue2.size() == 1){T front = queue2.front();//queue2.pop();return front;}throw std::exception("queue is empty");}void push(T data) //压栈{queue1.push(data);}T pop() //将栈顶元素弹出{while (queue1.size() > 1)//queue1的队尾元素是栈顶元素,将其余的倒腾到queue2中去{T front = queue1.front();queue1.pop();queue2.push(front);}if (queue1.size() == 1){T front = queue1.front();queue1.pop();return front;}while (queue2.size() > 1)//queue1没有元素,queue2有元素,queue2的队尾为栈顶元素,将其余的倒腾到queue1中去{T front = queue2.front();queue2.pop();queue1.push(front);}if (queue2.size() == 1){T front = queue2.front();queue2.pop();return front;}throw std::exception("queue is empty");}
private:queue<T> queue1; //用来压栈queue<T> queue2; //辅助容器
};int main(int argc, char *argv[])
{MyStack<int> stack;stack.push(1);stack.push(2);stack.push(3);int top = stack.top();//3cout << "top = " << top << endl; //3int n1 = stack.pop();int n2 = stack.pop();top = stack.top();cout << "top = " << top << endl; //1int n3 = stack.pop();cout << n1 << " "<< n2 << " " << n3 << endl; //入栈 1 2 3 ->出栈 3 2 1stack.clear();stack.push(100);stack.push(200);stack.push(300);n1 = stack.pop();n2 = stack.pop();n3 = stack.pop();cout << n1 << " " << n2 << " " << n3 << endl; //入栈 100 200 300 ->出栈 300 200 100return 0;
}
运行测试
C/C++面试题—使用STL两个队列实现一个栈相关推荐
- 两个栈实现一个队列,两个队列实现一个栈
题目:用两个栈实现一个队列,用两个队列实现一个栈. 首先要了解栈和队列这两种数据结构各自的特点,栈是一种后入先出(Last In First Out,LIFO)的数据结构,队列是一种先进先出(Firs ...
- java实现-两个栈实现一个队列和两个队列实现一个栈
1.两个栈实现一个队列 思路:压入元素直接入stack1,删除元素先判断stack2中是否为空,如果不为空直接弹出:为空则将stack1中的元素取出压入 stack2中再弹出. 代码: import ...
- python ——两个队列实现一个栈两个栈实现一个队列
1.两个队列实现一个栈 进栈:元素入队列A 出栈:判断如果队列A只有一个元素,则直接出队.否则,把队A中的元素出队并入队B,直到队A中只有一个元素,再直接出队.为了下一次继续操作,互换队A和队B. p ...
- 两个栈实现一个队列与两个队列实现一个栈
http://blog.csdn.net/z84616995z/article/details/19204529 两个栈实现一个队列: 原理方法:用一个栈为主栈,一个栈为辅助栈存放临时元素. 入队:将 ...
- 两个栈实现一个队列/两个队列实现一个栈
http://blog.csdn.net/sinat_30472685/article/details/70157227 1两个栈实现一个队列 1.原理分析: 队列的主要操作有两个:入队操作和出队操作 ...
- 数据结构:栈和列之如何用两个队列实现一个栈?两个栈实现一个队列?
1.栈和队列分析 栈是一种特殊的线性表.其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行 队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的 ...
- java 栈和队列实现迷宫代码_使用两个队列实现一个栈
两个队列实现一个栈 栈的特点是后进先出,队列的特点是先进先出.使用两个队列模拟栈,实现栈的push,pop,top,empty 操作. 假设队列中均为数字,其中队列q1为操作队列,q2为辅助队列. p ...
- 【c语言】两个队列实现一个栈
两个队列实现一个栈 核心思想:模拟出栈的后进先出操作 创建queue1和queue2,入栈时选择一个非空队列执行入队列操作(若两个队列都为空,则随机选择一个队列),出栈时需要先从非空队列queue1把 ...
- 【C++】两个队列实现一个栈
两个队列实现一个栈的思想:用_PushQ1队列作为push数据的队列,用_TmpQ2队列暂存数据 1.只要是对栈进行push操作,就将数据push入_PushQ1队列中. 2.要实现栈的pop操作,就 ...
最新文章
- linux centos7 升级 make 4.0
- jquery的sortable拖拽排序问题,在页面上多次拖拽保存顺序之后,刷新页面,排序出现紊乱
- 去掉bat和某些exe的黑窗口
- 简单算法的举例c语言,计算机科学与技术系C语言程序设计22简单算法举例.PPT
- 计算机工具软件应用考试,《计算机常用工具软件》期中考试题
- 为什么element的el-backtop会不管用,来看这里!
- CF773F Test Data Generation(倍增FFT/动态规划)
- C# windows定时服务+服务邮箱发送
- Dubbo-Admin 正式支持 3.0 服务治理
- CSDN 总部落户长沙,共建中国开发者产业中心城市!
- 数据库系统原理笔记:关系数据库设计
- ITSM在金融行业的应用
- 计算机思维中核心要素,思维导图核心三要素
- 如何用ps扣字体_PS如何抠文字 Photoshop抠字教程
- org.aspectj aspectjweaver 报错
- 智慧城市——智慧社区解决方案
- 【独立后台】2021全新最火表情包小程序源码,无限裂变,斗图小程序,头像壁纸,外卖服务内附详细搭建教程
- java 判断标点符号_Java判断中英文符号、标点的实现
- GetCheckedRadioButton
- 3分钟带你彻底弄懂数码管的段选与位选