数据结构-使用两个栈实现一个队列
1:如何只使用stack实现queue呢?我们知道stack是先进后出的(FIFO),而queue是先进先出的(FIFO)。也就是说,stack进行了一次反向。如果进行两次反向,就能实现queue的功能,所以我们需要两个stack实现queue。
下面是具体思路。
假设有两个栈A和B,且都为空。可以认为栈A为提供入队列的功能,栈B提供出队列的功能。
(1)如果栈B不为空,直接弹出栈B的数据。
(2)如果栈B为空,则依次弹出栈A的数据,放入到栈B中,再弹出栈B的数据。
代码如下:
![](/assets/blank.gif)
![](/assets/blank.gif)
#include "stdafx.h" #include<malloc.h> #include <iostream> #include <assert.h> using namespace std;/*单链表的节点,data表示节点的数据域,next指向下一个节点*/ class MyData { public:MyData() :data(0), next(NULL) {};//默认构造函数,这样表示后,主体中不用再写这个函数了MyData(int value) :data(value), next(NULL) {};//带参数的构造函数int data;//数据域MyData *next;//下一个节点 };/*表示栈的定义,其中public成员top表示栈顶,由于不能直接操作栈底,因此这里没有定义栈底的指针。 在默认构造函数中,把栈顶指针top置空,表示此时栈为空栈。*/ class MyStack { public:MyStack() :top(NULL) {};//默认构造函数void push(MyData data);//进栈void pop(MyData *pData);//出栈bool IsEmpty();//是否为空栈MyData *top;//栈顶 };class MyQueue { public:void enqueue(MyData data);//入队void dequeue(MyData &data);//出队bool IsEmpty();//是否为空队 private:MyStack s1;//用于入队MyStack s2;//用于出队 };//进栈 void MyStack::push(MyData data) {MyData *pData = NULL;pData = new MyData(data.data);//生成新节点pData->next = top;top = pData; }//判断栈是否为空 bool MyStack::IsEmpty() {return(top == NULL);//如果top为空,则返回1,否则返回0 }//出栈 void MyStack::pop(MyData *data)//将删除的节点保存到data中 {if (IsEmpty())//如果栈为空,直接返回 {return;}data->data = top->data;//给传出的参数赋值MyData *p = top;//临时保存原栈顶节点top = top->next;//移动栈顶,指向下一个节点delete p;//释放原栈顶节点内存 }//入队 void MyQueue::enqueue(MyData data) {s1.push(data);//只对s1进行操作 }//出队 void MyQueue::dequeue(MyData &data) {MyData temp(0);//局部变量,用于临时存储if (s2.IsEmpty()){while (!s1.IsEmpty())//如果s2为空,把s1的所有元素push到s2中 {s1.pop(&temp);//弹出s1的元素s2.push(temp);//压入s2中 }}if (!s2.IsEmpty()){s2.pop(&data);//此时s2不为空,则弹出s2的栈顶元素 } }//队列判空 bool MyQueue::IsEmpty() {//如果两个栈都为空,则返回1,否则返回0return(s1.IsEmpty() && s2.IsEmpty()); } int main() {MyData data(0);//定义一个节点 MyQueue q;q.enqueue(MyData(1));q.enqueue(MyData(2));q.enqueue(MyData(3));q.dequeue(data);cout << "dequeue" << data.data << endl;q.dequeue(data);cout << "dequeue" << data.data << endl;q.dequeue(data);cout << "dequeue" << data.data << endl;cout << "IsEmpty:" << q.IsEmpty() << endl;return 0; }
View Code
运行结果:
转载于:https://www.cnblogs.com/lovemi93/p/7607203.html
数据结构-使用两个栈实现一个队列相关推荐
- 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)
http://blog.csdn.net/hanjing_1995/article/details/51539578 使用两个栈实现一个队列 思路一: 我们设定s1是入栈的,s2是出栈的. 入队列,直 ...
- 数据结构:栈和列之如何用两个队列实现一个栈?两个栈实现一个队列?
1.栈和队列分析 栈是一种特殊的线性表.其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行 队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的 ...
- 两个栈实现一个队列,两个队列实现一个栈
题目:用两个栈实现一个队列,用两个队列实现一个栈. 首先要了解栈和队列这两种数据结构各自的特点,栈是一种后入先出(Last In First Out,LIFO)的数据结构,队列是一种先进先出(Firs ...
- 算法图解:如何用两个栈实现一个队列?
作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 本文已收录至 https://github.com/vipstone/algori ...
- 包含min函数的栈和两个栈实现一个队列
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:这是google的一道面试题. 看到这道题目时,第一反应就是每 ...
- java 栈和队列实现迷宫代码_算法图解:如何用两个栈实现一个队列?
本文已收录至 https://github.com/vipstone/algorithm <算法图解>系列. 队列和栈是计算机中两个非常重要的数据结构,经过前面的学习(<队列> ...
- 由两个栈组成一个队列
使用C++完成<程序员代码面试指南 IT名企算法与数据结构题目> 题目 编写一个类,用两个栈实现队列,支持队列操作: - push:入队 - pop:出队(不返回值) - front:返回 ...
- 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...
多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...
- 【剑指offer】用两个栈实现一个队列
题目:两个栈实现一个队列. 栈的特点:先进后出,队列的特点是先进先出 思路:stack1放入数据:pop时,先判断stack2是否为空,如果不为空,直接pop,如果空,则push(stack1.pop ...
最新文章
- php 处理html,PHP解析HTML代码
- 深度学习(1)--引言
- 用python批量下载网络图片_python 批量下载网页里的图片
- Linux /proc/pid目录下相应文件的信息说明和含义
- 【?异或】LeetCode 260. Single Number III
- oracle函数大全-字符处理函
- iOS网络编程-ASIHTTPRequest小例子-数据请求队列
- MySQL性能优化(六):分区
- 扫描仪显示计算机繁忙或故障,为什么我的兄弟打印机每次扫描图像文件总是显示连接计算机,但是电脑就没有弹出那个框让我选择?请求高手...
- 感悟-关于爱情(一年半,最后一次告别)
- js实现图片虚化_Web前端之高斯模糊图片记
- 企业IT咨询和信息化规划方法
- 移动文件后图标变白解决方法
- html日历页面节假日_html+css+js实现一个简易日历
- 绿源2022一款新电动车——cola3,祝你3.8女神节快乐
- android开机动画多长时间_android开关机动画和铃声配置
- 从0开始带你成为jvm实战高手(狸猫技术窝)
- 一般通话记录能保存多少条_电话的通话记录可以保存多久
- 极大似然估计、极大似然函数
- C++网络编程(四):多进程并发服务器
热门文章
- 计算机与环境科学,计算机在环境科学与工程方向的应用
- mysql数据库恢复策略_MySQL 备份和恢复策略(一)
- bootstrap table 分页_Java入门007~springboot+freemarker+bootstrap快速实现分页功能
- 电脑k歌软件_金麦客专业k歌app下载|金麦客专业k歌软件 手机安卓版v1.1.5.0 下载...
- LeetCode 2176. 统计数组中相等且可以被整除的数对
- LeetCode 2146. 价格范围内最高排名的 K 样物品(BFS)
- LeetCode 2076. 处理含限制条件的好友请求(并查集)
- 天池 在线编程 所有子数组之和(排列组合)
- LeetCode 1688. 比赛中的配对次数(模拟)
- LeetCode 第 35 场双周赛(216/2839,前7.61%)