/*
题目:用两个队列实现一个栈
算法思路:
现有两个队列q1与q2,入栈:如果q1与q2都为空,那么我们选择q1入栈也就是入队列,比如q1入栈 1 2 3 4 ;现在要出栈,后进先出那么4要出栈。但是q1是一个
队列,先进先出,那么 1 2 3出队列 q2 1 2 3 入队列,q1中此时剩余4,把4出对列达到出栈的效果。  这个时候如果我们又加入一个元素5,那么我们应该把5放到
q1还是q2,因为现在q2中有 1 2 3,把5放到q1不方便统计,所以要把5放入到q2;如果5放到了q1,等下编写出栈的代码很麻烦,如果放到q2我们只需要分类:q2
是不是为空,为空的为一种情况,不为空的为一种情况:
所以最后:
如果q1与q2都为空,那么往q1中插入元素
如果q1不为空,那么往q1中插入元素
如果q2不为空,那么往q1中插入元素
*/

#include "stdio.h"
#include <iostream>
#include <queue>
using namespace std;template<typename T>class CStack
{
private:queue<T> q1;queue<T> q2;int nCount;//用来统计队列中有几个元素,只有队列中元素剩余一个时,才能实现后进先出的功能(栈)public:void appendTail(const T& data);T deleteTail();int GetNum() const;CStack(){nCount = 0;}
};template<typename T>
int CStack<T>::GetNum() const
{return nCount;
}template<typename T>
void CStack<T>::appendTail(const T& data)
{//一直保证q1与q2有一个为空,比如q1如栈 1 2 3 4 ,现在要出栈4,那么把1 2 3 出队列q1让如队列q2,4出栈//之后,此时如果有加入一个元素,那么最后加到q2中。if (q1.size() == 0 && q2.size() == 0)//如果q1与q2都为空,那么往q1中插入元素{q1.push(data);}else if (q1.size()>0)//如果q1不为空,那么往q1中插入元素{q1.push(data);}else if (q2.size()>0)//如果q2不为空,那么往q1中插入元素{q2.push(data);}++nCount;
}template<typename T>
T CStack<T>::deleteTail()
{T ret;if (q2.size() == 0){while (q1.size() != 1){T& data = q1.front();q1.pop();q2.push(data);}ret = q1.front();q1.pop();cout << ret << endl;}else{while (q2.size() != 1){T& data = q2.front();q2.pop();q1.push(data);}ret = q2.front();q2.pop();cout << ret << endl;}--nCount;return ret;//返回删除的元素
}int main()
{CStack<int> stack;stack.appendTail(88);stack.appendTail(44);stack.appendTail(99);cout << "元素的个数:" << stack.GetNum() << endl;//3cout << "出栈,后进先出:" << endl;//99stack.deleteTail();cout << "元素的个数:" << stack.GetNum() << endl;//2cout << "出栈,后进先出:" << endl;//44stack.deleteTail();stack.appendTail(777);//插入一个新的元素777cout << "元素的个数:" << stack.GetNum() << endl;//2cout << "出栈,后进先出:" << endl;//777stack.deleteTail();cout << "元素的个数:" << stack.GetNum() << endl;//1cout << "出栈,后进先出:" << endl;//88stack.deleteTail();return 0;
}

参考博文:https://blog.csdn.net/djb100316878/article/details/41820953

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

  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. oracle flex cluster,Oracle Flex ASM和Flex集群
  2. Nginx的405 not allowed错误解决
  3. 漫画:如何证明sleep不释放锁,而wait释放锁?
  4. [转]异步性能:了解 Async 和 Await 的成本
  5. python训练模型太大怎么处理_趣味Python之如何降低过拟合风险
  6. 二叉查找树与平衡二叉树【转载】
  7. STL 合集(不断补充)
  8. flask blueprint
  9. php中声明一个函数,php学习笔记之 函数声明
  10. Linux学习(lesson1)
  11. 也论不使用第三个变量交换两个变量的值[C#]
  12. 文本文档怎么转换为html文件,win10系统下如何将文本文档转换为网页
  13. 笨方法学python第二版_笨方法学python II
  14. 如何快速打开控制面板?如何让控制面板在桌面显示?
  15. 夏令时-前端要知道的知识
  16. 为什么人人都爱油炸食物?
  17. android平板2018,2018 Android平板电脑推荐三星或华为更好
  18. 英语中表示同意或肯定的词
  19. PayPal取消了连连支付快捷提现,我是如何提现到国内的?
  20. word/ppt中如何插入11以上带圆圈的数字序号

热门文章

  1. Atitit 薪酬管理法 工作手册 员:薪酬管理办法 1.薪酬结构 所有员工的薪酬均由岗位工资、级别工资、校龄工资、特别津贴、绩效工资和季度奖金六部分组成。其中岗位工资、级别工资、校龄工资、22
  2. Atitit 常用数据校验规则
  3. Atitit  深入理解命名空间namespace  java c# php js
  4. paip.log4j 日志系统 参数以及最佳实践
  5. paip.提升用户体验---控件透明的设置
  6. 微服务架构与API网关
  7. 创业邦:谈谈 To B业务的机会
  8. UBS缘何突然抛弃智能投顾?全球财富管理霸主的数字化转型启示(上)
  9. (转)一个由自由职业者建立的量化对冲基金
  10. Julia: LightTable 插件方式 与 JUNO