面试题:用两个队列实现一个栈
在做这道题之前,我们首先要搞清楚队列和栈的特点。
队列:先进先出,即插入数据在队尾进行,删除数据在队头进行;
栈:后进先出,即插入与删除数据均在栈顶进行。
POP:
如果我们要实现一个栈,我们先进入的数据一定是先出去的,怎么样利用队列实现这个特点呢?我们可以利用两个队列来进行数据顺序的调整。当我们需要删除数据时,我们可以先将数据push到一个队列当中,pop时,因为队列是先进先出的,所以我们可以将队尾的元素保留下来,其余元素按照出队的顺序入队到另外一个队列当中,然后pop第一个队列的最后一个元素,这样就实现了栈的删除操作。
上图是栈进行一次删除数据的示意图,当我们需要再次删除数据时,我们需要将queue2的队尾数据保存下来进行pop,其余数据入队到另外一个队列当中。就这样利用两个队列来对数据进行来回交换实现栈。
写代码的时候需要注意当两个队列都为空的时候是没有办法pop数据的。
PUSH:
当我们要插入数据的时候,我们需要对队列进行判断,将数据插入到非空的队列当中。这样的话pop时我们分情况讨论的时候只用分队列为空和不为空两种情况,有利于代码的编写。若是插入数据时将数据插入到非空队列,那就可能出现第三种情况,两个队列都不为空,这个时候写的代码就比较复杂了。所以选择第一种方式。
#include<iostream>
#include<queue>using namespace std;
template<typename T>
class Satck
{
public:Satck(){}~Satck(){}void Push(const T& data){if (queue1.size()>0)//q1非空{queue1.push( data);}else if (queue2.size() > 0)//q2非空{queue2.push( data);}else//q1,q2都为空{queue1.push( data);}}void Pop(){if (queue1.size() != NULL ){while (queue1.size()!=1){queue2.push(queue1.front());queue1.pop();}queue1.pop();}else{while (queue2.size() != 1){queue1.push(queue2.front());queue2.pop();}queue2.pop();}}T& Top(){if (queue1.size() > 0){return queue1.front();}else{return queue2.front();}}bool Empty(){if (queue1.empty() && queue2.empty()){return true ;}elsereturn false ;}size_t Size(){if (queue1.empty() && queue2.empty()){return 0;}else if (queue1.size() > 0){return queue1.size();}else{return queue2.size();}}
private:queue<T > queue1;queue<T > queue2;
};void funtest()
{Satck<int > stack;stack.Push(1);stack.Push(2);stack.Push(3);stack.Push(4);stack.Push(5);cout << stack.Size() << endl;cout << stack.Empty() << endl;cout << stack.Top() << endl;stack.Pop();cout << stack.Top() << endl;stack.Push(5);stack.Pop();}
int main()
{funtest();return 0;
}
面试题:用两个队列实现一个栈相关推荐
- C/C++面试题—使用STL两个队列实现一个栈
题目介绍 使用STL中的两个队列实现一个栈,实现栈的top.pop.push.clear等操作. 思路分析 思路和使用2个栈实现一个队列是相通的,用一个队列queue1容器用来 压栈,出栈的时候判断q ...
- 两个栈实现一个队列,两个队列实现一个栈
题目:用两个栈实现一个队列,用两个队列实现一个栈. 首先要了解栈和队列这两种数据结构各自的特点,栈是一种后入先出(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操作,就 ...
最新文章
- 虚拟机的操作系统的安装
- postman+newman(2)
- 气象背景场_“把脉”风雨 服务为民——甘肃研究型气象预报业务体系发展扫描...
- Springboot中进行日志打印需要的信息
- JBoss Fuse 6.1 + HawtIO第一部分
- IDEA项目找不到浏览器报错的情况
- 为什么说在国内考CISP比CISSP要好?
- 【英语学习】【English L06】U02 Food L4 Food around the world
- 儿歌-宝宝学唱儿歌 ios版
- js简单实现div宽度匀速增加/减小
- bzoj 4300绝世好题
- 多线程等待唤醒机制之生产消费者模式
- 菜鸟谷歌浏览器打印组件技术分析
- R 回归 虚拟变量na_R语言 | 回归分析(一)
- 图片格式转换器ico_格式工厂万能格式转换器
- c语言中next如何用,C++ STL prev()和next()函数用法详解
- WeChat微信商户号JSAPI支付 支付授权目录无法添加:添加完成后不刷新再添加一遍
- android t9搜索算法,T9拨号盘搜索和排序算法
- Oracle11安装教程
- Android属于绑定服务特点是,Android P HIDL服务绑定模式与直通模式的分析 (原创)
热门文章
- android imageview 半透明,如何将半透明视图叠加到ImageView上?
- Unity人物动画问题
- DSD解码ES9038PRO和AK4497
- Java日志框架 -- Logback(Logback入门案例、logback配置(FileAppender、异步日志、拆分Appender、过滤器)、logback-access)
- C语言!鸡兔同笼的程序
- 启动Apache时提示缺少vcruntime140.dll怎么解
- C#cefsharp Winform
- 关于appium环境搭建
- 【Android】实现应用简单的用户登录界面
- unity 插件curvy做出来的效果以及 curvy的部分BUG(也算不上BUG吧)