用两个栈实现一个队列用两个队列实现一个栈
区别与联系
- 相同点:
- (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;
}
用两个栈实现一个队列用两个队列实现一个栈相关推荐
- 两个栈实现一个队列,两个队列实现一个栈
题目:用两个栈实现一个队列,用两个队列实现一个栈. 首先要了解栈和队列这两种数据结构各自的特点,栈是一种后入先出(Last In First Out,LIFO)的数据结构,队列是一种先进先出(Firs ...
- 两个栈实现一个队列与两个队列实现一个栈
http://blog.csdn.net/z84616995z/article/details/19204529 两个栈实现一个队列: 原理方法:用一个栈为主栈,一个栈为辅助栈存放临时元素. 入队:将 ...
- 栈与队列2——两个栈组成队列
题目 编写一个类,用两个栈实现一个队列,并实现队列的基本操作(add,poll,peek) 思路 一个栈stackPush作为正常压入的栈,一个栈stackPop作为弹出的栈,将stackPush中的 ...
- 两个栈实现队列与两个队列实现栈
1. 两个栈实现队列 实现一 思路 s1是入栈的,s2是出栈的. 入队列,直接压到s1是就行了 出队列,先把s1中的元素全部出栈压入到s2中,弹出s2中的栈顶元素:再把s2的所有元素全部压回s1中 实 ...
- C#数据结构:两栈实现队列,两队列实现栈
两个栈实现队列:栈实现先进先出 栈1负责队尾,栈2负责队头 每次入队,栈2无元素且栈1无元素,入栈2:否则入栈1 每次出队,栈2有元素,出栈2顶:否则把全部栈1入栈2,再出栈2顶 bool Pop(r ...
- 栈顶指针和队尾指针指向当前位置和指向下一个位置的区别?——轻松搞懂栈和队列指针的指向问题
我们先看一下队列的队尾指针指向队尾元素的当前位置的入队操作: 可以看到,当队尾指针指向的是队尾元素时,我想加入一个新的元素,这时直接放在队尾指向的位置是不可以的,因为这个位置已经有元素了,所以先要对队 ...
- 【学校实验】停车场问题:设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
停车场问题 问题描述 测试数据 基本要求 实现提示 代码实现 栈的实现 队列的实现 主函数的实现 问题描述 设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆 ...
- 两顺序栈共享Java_数据结构与算法(三),栈与队列
上一篇<数据结构与算法(二),线性表>中介绍了数据结构中线性表的两种不同实现--顺序表与链表.这一篇主要介绍线性表中比较特殊的两种数据结构--栈与队列.首先必须明确一点,栈和队列都是线性表 ...
- 一个数组实现两个栈(共享栈)
题目: 一个数组实现两个栈. 方法1: 下标为0的位置为栈1的栈底,下标为1的位置为栈2的栈底,栈1的元素存放在下标为偶数的位置上,栈2的元素放在下标为奇数的位置上. 如上图所示的数组:若 ...
- 算法与数据结构题目的 PHP 实现:栈和队列 由两个栈组成的队列
思路:同样使用 PHP 的数组模拟栈.栈的特点是先进后出,队列的特点是先进先出,可以用第一个栈(StackPush)作为压入栈,压入数据的时候只往这个栈中压入数据,第二个栈作(StackPop)为弹出 ...
最新文章
- 设置在桌面上不显示计算机,怎么在桌面上显示我的电脑 我的电脑桌面不显示怎么办...
- markdown 常用格式
- MySQL存储过程问题
- EMV内核使用中的常见问题
- 在SQL Server Management Studio 中建立外键约束
- 信息系统开发平台OpenExpressApp -如何部署OEA应用
- leetcode题库221-- 最大正方形
- 中兴路西藏北路到浦东国际机场路线(ddmap20100114)
- paypal如何支付欧元_国际在线支付巨头——PayPal
- optistruct线性求解一次二次单元应力位移比较
- 官网版本的windows pe系统启动盘制作过程
- 腾讯会议 .wemta 文件如何转码成 mp4 文件
- Java 删除session实现退出登录
- Linux系统管理(一)基础管理
- Q200 EX.查看写入和预计使用寿命
- 查看linux主机多少位,linux怎么查看系统是32位还是64位的方法
- Java知识点串讲之面向对象简述
- 旅游地图制作_手把手教你用旅游神器App:谷歌地图
- 从事文字工作和经常使用电脑的人要注意保护好自己的眼睛
- 用C#开发加密狗程序