我们通过一系列栈的压入和弹出操作来分析用两个队列模拟一个栈的过程。如图(a)所示,我们先往栈内压入一个元素A。由于两个队列现在都是空的,我们可以选择把A插入两个队列的任意一个。不妨插入queue1。接下来继续往栈内压入B、C两个元素,我们把它们都插入queue1。这个时候queue1包含3个元素A、B和C,其中A位于队列的头部,C位于队列的尾部。

  现在我们考虑从栈内弹出一个元素。根据栈的后入先出原则,最后被压入栈的C应该最先被弹出。由于C位于queue1的尾部,而我们每次只能从队列的头部删除元素,因此我们可以先从queue1中依次删除元素A、B并插入到queue2中,再从queue1中删除元素C。这就相当于从栈中弹出元素C了(如图(b)所示)。我们可以用同样的方法从栈内弹出元素B(如图©所示)

  接下来我们考虑往栈内压入一个元素D。此时queue1已经有一个元素,我们就把D插入到queue1的尾部(如图(d)所示)。如果我们再从栈内弹出一个元素,此时被弹出的应该是最后被压入的D。由于D位于queue1的尾部,我们只能先从有删除queue1的元素并插入到queue2,直到在queue1中遇到D再直接把它删除(如图(e)所示)。
  
  注意在此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的那些元素,那么此时空队列不为空了,原来的非空队列变为空了,总是这样循环。
  
  完整代码

#include <iostream>
#include <stdlib.h>
#include <stack>
#include <queue>
using namespace std;template <typename T> class CStack
{public:CStack(void){};~CStack(void){};void push(const T& node);T pop();private:queue<T> queue1;queue<T> queue2;
};//插入元素:往非空的队列中增加元素,若都为空,则默认往queue1中添加
template <typename T> void CStack<T>::push(const T& element)
{if (queue1.size() > 0)//如果queue1不为空则往queue1中插入元素queue1.push(element);else if (queue2.size() > 0)//如果queue2不为空则往queue2中插入元素queue2.push(element);else//如果两个队列都为空,则往queue1中插入元素queue1.push(element);}//删除元素
template <typename T> T CStack<T>::pop()
{if (queue1.size() == 0)    //如果queue1为空{while (queue2.size() > 1)    //当queue2中大于一个元素时,则//将其余元素保存到queue1中,保证queue2中只有一个元素{queue1.push(queue2.front());//压入queue1queue2.pop();//然后删除}//只剩下一个元素时,即出列,此时对于由两个队列构成的栈而言,//弹出的即是最后进入的元素,符合后进先出T& data = queue2.front();//存储queue2.pop();//而后删除return data;}else   //如果queue2为空{while (queue1.size() > 1) // 当queue1中大于一个元素时,则//将其余元素保存到queue2中,保证queue1中只有一个元素{queue2.push(queue1.front());//压入queue2queue1.pop();//然后删除}//只剩下一个元素时,即出列,此时对于由两个队列构成的栈而言,//弹出的即是最后进入的元素,符合后进先出T& data = queue1.front();queue1.pop();return data;}
}int main()
{CStack<int> stack;stack.push(1);stack.push(2);stack.push(3);stack.push(4);int len = 4;while (len>0){cout << stack.pop() << " ";--len;}return 0;
}

对于push和pop操作,其时间为O(n).

运行结果:

用两个队列实现一个栈相关推荐

  1. 两个栈实现一个队列,两个队列实现一个栈

    题目:用两个栈实现一个队列,用两个队列实现一个栈. 首先要了解栈和队列这两种数据结构各自的特点,栈是一种后入先出(Last In First Out,LIFO)的数据结构,队列是一种先进先出(Firs ...

  2. java实现-两个栈实现一个队列和两个队列实现一个栈

    1.两个栈实现一个队列 思路:压入元素直接入stack1,删除元素先判断stack2中是否为空,如果不为空直接弹出:为空则将stack1中的元素取出压入 stack2中再弹出. 代码: import ...

  3. python ——两个队列实现一个栈两个栈实现一个队列

    1.两个队列实现一个栈 进栈:元素入队列A 出栈:判断如果队列A只有一个元素,则直接出队.否则,把队A中的元素出队并入队B,直到队A中只有一个元素,再直接出队.为了下一次继续操作,互换队A和队B. p ...

  4. 两个栈实现一个队列与两个队列实现一个栈

    http://blog.csdn.net/z84616995z/article/details/19204529 两个栈实现一个队列: 原理方法:用一个栈为主栈,一个栈为辅助栈存放临时元素. 入队:将 ...

  5. 两个栈实现一个队列/两个队列实现一个栈

    http://blog.csdn.net/sinat_30472685/article/details/70157227 1两个栈实现一个队列 1.原理分析: 队列的主要操作有两个:入队操作和出队操作 ...

  6. 数据结构:栈和列之如何用两个队列实现一个栈?两个栈实现一个队列?

    1.栈和队列分析 栈是一种特殊的线性表.其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行 队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的 ...

  7. C/C++面试题—使用STL两个队列实现一个栈

    题目介绍 使用STL中的两个队列实现一个栈,实现栈的top.pop.push.clear等操作. 思路分析 思路和使用2个栈实现一个队列是相通的,用一个队列queue1容器用来 压栈,出栈的时候判断q ...

  8. java 栈和队列实现迷宫代码_使用两个队列实现一个栈

    两个队列实现一个栈 栈的特点是后进先出,队列的特点是先进先出.使用两个队列模拟栈,实现栈的push,pop,top,empty 操作. 假设队列中均为数字,其中队列q1为操作队列,q2为辅助队列. p ...

  9. 【c语言】两个队列实现一个栈

    两个队列实现一个栈 核心思想:模拟出栈的后进先出操作 创建queue1和queue2,入栈时选择一个非空队列执行入队列操作(若两个队列都为空,则随机选择一个队列),出栈时需要先从非空队列queue1把 ...

  10. 【C++】两个队列实现一个栈

    两个队列实现一个栈的思想:用_PushQ1队列作为push数据的队列,用_TmpQ2队列暂存数据 1.只要是对栈进行push操作,就将数据push入_PushQ1队列中. 2.要实现栈的pop操作,就 ...

最新文章

  1. codeviz安装使用全记录
  2. 自由自在意式手工冰淇淋式的生活方式
  3. 中奖人员信息向上滚动
  4. jsp mysql书店源码_使用jsp数据库mysql实现网上购物书店课程设计
  5. linux select函数用法
  6. HDU2079 选课时间【母函数】
  7. 二十一天学通之cookie的路径和域
  8. 专注技术,回归本质,这就是太平洋未来科技的创新之处...
  9. 位图切割器位图裁剪器
  10. iOS:tintColor详解
  11. usb uvc协议 1
  12. Error creating bean with name ‘serverEndpointExporter‘ defined in class path resource
  13. 我的个人知识管理PKM
  14. 房贷等额本息利率上涨要跟着涨吗?
  15. 2020年泰迪杯C题智慧政务中的文本数据挖掘应用--论文+全部源码分享
  16. .9图片报错Execution failed for task ':app:mergeDebugResources'. Crunching Cruncher scrollbar_thumb.9.p
  17. 数字音乐各种高保真音乐格式
  18. python制作qq登录界面_用Python实现一个最新QQ办公版(TIM)的登录界面
  19. Linux下随机生成密码的命令总结
  20. java excel 插件_轻量级的原生JavaScript的Excel插件——JExcel

热门文章

  1. 技术交底书(二)-----一种基于移动终端的安全防护系统
  2. tp3.2ajax上传文件,jquery - thinkphp3.2.3 ajax上传图片
  3. 计算机长宽高公式,单位换算公式大集合
  4. 阿里矢量图库 iconfont 引入项目使用方法
  5. 2012年度优秀软件企业、优秀软件人才和优秀软件产品
  6. 有专门收C语言答案的软件吗,C语言二级考试题库APP
  7. 重庆python爬虫培训_PYTHON爬虫工程师
  8. 摩尔定律和梅特卡夫定律_摩尔定律f
  9. Java从入门到精通章节练习题——第三章
  10. 通达OA2017 工作流设计中“退回”功能的升级测试(图文)