区别与联系

  • 相同点:
  • (1)栈和队列都是控制访问点的线性表;
  • (2)栈和队列都是允许在端点处进行数据的插入和删除的数据结构;
  • 不同点:
  • (1)栈遵循“后进先出(LIFO)”的原则,即只能在该线性表的一头进行数据的插入和删除,该位置称为“栈顶”, 而另外一头称为“栈底”;根据该特性,实现栈时用顺序表比较好;
  • (2)队列遵循“先进先出(FIFO)”的原则,即只能在队列的尾部插入元素,头部删除元素。根据该特性,在实现队 列时用链表比较好
  • 应用场景
  • 栈:括号匹配;用于计算后缀表达式,等数据结构中

  • 队列:应用于类似现实生活中一些排队问题,例如Linux中我们学习进程间通信的时候,有一种通信方式就是“消息队列”等。

两个队列实现一个栈

  • 当栈里面插入元素“abcd”的时候,元素a在栈底(最后出去),d在栈顶(最先出去);

  • 将元素“abc”从q1中头删,然后再q2中尾插进来之后,头删q1中的元素“d”,就相当于实现了栈顶元素的出栈;

  • 同理,将元素“ab”从q2中头删,然后尾插到q1中,然后再头删q2中的元素“c”;

  • 同理,删除元素“b”;

  • 当栈又插入一个元素“e”时,此时元素“a”不能从队列中删除,而是将元素“a”插入q2中,再删除q1中的元素“e”,最后再删除元素“a”。

template<typename T> class CStack
{
public:CStack(void);~CStack(void);void appendTail(const T& node);T deleteHead();private:queue<T> q1;queue<T> q2;
};template<typename T>
void CStack<T>::appendTail(const T& node)//实现栈元素的插入
{//数据的插入原则:保持一个队列为空,一个队列不为空,往不为空的队列中插入元素if (!q1.empty()){q1.push(node);}else{q2.push(node);}
}template<typename T>
T CStack<T>::deleteHead()//实现栈元素的删除
{int ret = 0;if (!q1.empty()){int num = q1.size();while (num > 1){q2.push(q1.front());q1.pop();--num;}ret = q1.front();q1.pop();}else{int num = q2.size();while (num > 1){q1.push(q2.front());q2.pop();--num;}ret = q2.front();q2.pop();}return ret;
}

两个栈实现一个队列

  • 将队列中的元素“abcd”压入stack1中,此时stack2为空;

  • 将stack1中的元素pop进stack2中,此时pop一下stack2中的元素,就可以达到和队列删除数据一样的顺序了;

  • 可能有些人很疑惑,就像图3,当stack2只pop了一个元素a时,satck1中可能还会插入元素e,这时如果将stack1中的元素e插入stack2中,在a之后出栈的元素就是e了,显然,这样想是不对的,我们必须规定当stack2中的元素pop完之后,也就是satck2为空时,再插入stack1中的元素。

template<typename T> class CQueue
{
public:CQueue(void);~CQueue(void);void appendTail(const T& node);T deleteHead();private:stack<T> stack1;stack<T> stack2;
};template<typename T>
void CQueue<T>::appendTail(const& T& element)//尾插
{stack1.push(element);
}template<typename T>
T CQueue<T>::deleteHead()
{if (stack2.size() <= 0){while (stack1.size > 0){T& data = stack1.top();stack1.pop();stack2.push(data);}}T head = stack2.top();stack2.pop();if (stack2.size() == 0)//当stack2为空时,抛异常throw new exception("queue is empty");return head;
}

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

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

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

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

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

  3. 栈与队列2——两个栈组成队列

    题目 编写一个类,用两个栈实现一个队列,并实现队列的基本操作(add,poll,peek) 思路 一个栈stackPush作为正常压入的栈,一个栈stackPop作为弹出的栈,将stackPush中的 ...

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

    1. 两个栈实现队列 实现一 思路 s1是入栈的,s2是出栈的. 入队列,直接压到s1是就行了 出队列,先把s1中的元素全部出栈压入到s2中,弹出s2中的栈顶元素:再把s2的所有元素全部压回s1中 实 ...

  5. C#数据结构:两栈实现队列,两队列实现栈

    两个栈实现队列:栈实现先进先出 栈1负责队尾,栈2负责队头 每次入队,栈2无元素且栈1无元素,入栈2:否则入栈1 每次出队,栈2有元素,出栈2顶:否则把全部栈1入栈2,再出栈2顶 bool Pop(r ...

  6. 栈顶指针和队尾指针指向当前位置和指向下一个位置的区别?——轻松搞懂栈和队列指针的指向问题

    我们先看一下队列的队尾指针指向队尾元素的当前位置的入队操作: 可以看到,当队尾指针指向的是队尾元素时,我想加入一个新的元素,这时直接放在队尾指向的位置是不可以的,因为这个位置已经有元素了,所以先要对队 ...

  7. 【学校实验】停车场问题:设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。

    停车场问题 问题描述 测试数据 基本要求 实现提示 代码实现 栈的实现 队列的实现 主函数的实现 问题描述 设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆 ...

  8. 两顺序栈共享Java_数据结构与算法(三),栈与队列

    上一篇<数据结构与算法(二),线性表>中介绍了数据结构中线性表的两种不同实现--顺序表与链表.这一篇主要介绍线性表中比较特殊的两种数据结构--栈与队列.首先必须明确一点,栈和队列都是线性表 ...

  9. 一个数组实现两个栈(共享栈)

    题目:   一个数组实现两个栈. 方法1:   下标为0的位置为栈1的栈底,下标为1的位置为栈2的栈底,栈1的元素存放在下标为偶数的位置上,栈2的元素放在下标为奇数的位置上.   如上图所示的数组:若 ...

  10. 算法与数据结构题目的 PHP 实现:栈和队列 由两个栈组成的队列

    思路:同样使用 PHP 的数组模拟栈.栈的特点是先进后出,队列的特点是先进先出,可以用第一个栈(StackPush)作为压入栈,压入数据的时候只往这个栈中压入数据,第二个栈作(StackPop)为弹出 ...

最新文章

  1. 设置在桌面上不显示计算机,怎么在桌面上显示我的电脑 我的电脑桌面不显示怎么办...
  2. markdown 常用格式
  3. MySQL存储过程问题
  4. EMV内核使用中的常见问题
  5. 在SQL Server Management Studio 中建立外键约束
  6. 信息系统开发平台OpenExpressApp -如何部署OEA应用
  7. leetcode题库221-- 最大正方形
  8. 中兴路西藏北路到浦东国际机场路线(ddmap20100114)
  9. paypal如何支付欧元_国际在线支付巨头——PayPal
  10. optistruct线性求解一次二次单元应力位移比较
  11. 官网版本的windows pe系统启动盘制作过程
  12. 腾讯会议 .wemta 文件如何转码成 mp4 文件
  13. Java 删除session实现退出登录
  14. Linux系统管理(一)基础管理
  15. Q200 EX.查看写入和预计使用寿命
  16. 查看linux主机多少位,linux怎么查看系统是32位还是64位的方法
  17. Java知识点串讲之面向对象简述
  18. 旅游地图制作_手把手教你用旅游神器App:谷歌地图
  19. 从事文字工作和经常使用电脑的人要注意保护好自己的眼睛
  20. 用C#开发加密狗程序

热门文章

  1. cad黑色背景变成白色_CAD操作记不全?看这个就够了!附上全面整理,动图教程-深圳造价培训...
  2. 一位全减器VHDL语言
  3. Android 图片人脸识别剪切
  4. Codeblock一直卡在编译界面
  5. Python爬虫实战 --实现 QQ空间自动点赞
  6. 【单片机仿真】(十一)指令系统逻辑运算指令 — 逻辑与指令ANL、逻辑或指令ORL
  7. ubuntu MeshLab安装
  8. Python 显示实时时间方法
  9. 神经网络信息双向传播,神经网络反向传播推导
  10. PyKeyBoardFairy可以替代你游戏中的卡键盘和鼠标宏