两个栈实现一个队列

要想实现此方法,我们现需要了解一下什么是栈和队列。

栈(Stack是一种只能在一端进行插入或删除操作的线性表。) 表中允许进行插入、删除操作的一端称为栈顶(Top)。栈顶的当前位置是动态的,栈顶的当前位置是由一个称为栈顶指针的位置指示器指示。表的另一端称为栈底(Bottom)。当栈中没有数据元素时称为空栈。栈的插入操作称为进栈或入栈(Push),删除操作称为退栈或出栈(Pop)。

栈的主要特点是 “后进先出”,即后进栈的元素先弹出。每次进栈的数据元素都放在原当前栈顶元素之前成为新的栈顶元素,每次出栈的数据元素都是当前栈顶元素。栈也称为后进先出表。

队列

队列简称队(Queue),它也是一种操作受限的线性表,其限制为仅允许在表的一端进行插入,而在表的另一端进行删除。把进行插入的一端称做队尾(rear),进行删除的一端称做队首或队头(front)。向队列中插入新元素称为进队或入队,新元素进入后就成为新的队尾元素;从队列中删除元素称为出队或离队,元素出队后,其直接后继元素就成为队首元素。

由于队列的插入和删除操作分别是在各自的一端进行的,每个元素必然按照进入的次序出队,所以又把队列称为先进先出表

解题思路

1、因为队列是先进先出,栈是后进先出,所以我们可以将两个栈当作两个杯子,添加元素就相当于往里面放正方体。
2、队列的添加元素是从队尾插入,所以每当放入第一个杯子里的正方体,我们将第一个正方体再放入第二个杯子,将第二个物体放到第一个杯子,再把第二个杯子里的第一个正方体放到第一个杯子的第二个物体上,以此类推放置五个,就是我们实现队列的效果了。
3、为了避免队列的顺序错乱,所以我们在做添加或输出是保持另一个栈为空。

图解



我们保持栈2为空,通过栈2来将五个元素过度一下,栈2的作用就是相当于一个中介,只是通过栈2来调整顺序以实现队列的效果。

代码实现

#include<stack>
class ToQueue
{public:ToQueue(){}~ToQueue(){}int back();//返回最后一元素bool empty();//判断队列是否为空int front();//返回第一个元素void pop();//删除第一个元素void push(int num);//在末尾添加一个元素int size();//返回第一个元素
private:stack<int> stack1;//栈1stack<int> stack2;//栈2
#include "ToQueue.h"int ToQueue::back()//返回最后一个元素
{while (!stack1.empty())//当栈1不为空{stack2.push(stack1.top());//把栈1的第一个元素返回到栈2stack1.pop();//删除栈1的第一个元素}int i = stack2.top();//定义临时变量保存栈2的栈顶元素,//此变量就为队的第一个元素while (!stack2.empty())//当栈2不为空{stack1.push(stack2.top());//将栈2的栈顶元素添加到栈1末尾stack2.pop();//移除栈2栈顶元素}return i;//返回临时变量
}
bool ToQueue::empty()//判断队列是否为空
{return stack1.empty();//判断栈1是否为空
}
int ToQueue::front()//返回队列第一个元素
{ return stack1.top();//返回栈1的第一个元素
}
void ToQueue::pop()//删除第一个元素
{return stack1.pop();//删除栈1的第一元素
}
void ToQueue::push(int num)//在末尾添加一个元素
{while (!stack1.empty())//当栈1不为空时{stack2.push(stack1.top());//将栈1的第一个元素添加到栈2的栈顶stack1.pop();//移除栈1的栈顶元素}stack1.push(num);//添加元素到栈1的栈顶while (!stack2.empty())//当栈2不为空{stack1.push(stack2.top());//将栈2的第一个元素添加到栈1的栈顶stack2.pop();//移除栈2的栈顶元素}
}
int ToQueue::size()//返回队列中元素的个数
{return stack1.size();//返回栈1的计数器
}
int main()
{ToQueue tq;tq.push(1);tq.push(2);tq.push(3);tq.push(4);tq.push(5);tq.push(6);cout << "打印队列" << endl;while (!tq.empty()){cout << tq.front()<< endl;tq.pop();}}

输出的结果为:
由此可见,我们通过两个栈实现了队列的功能。
如有问题欢迎指出,希望大家多多点评!

两个栈实现一个队列(图解),一看就懂相关推荐

  1. 算法图解:如何用两个栈实现一个队列?

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 本文已收录至 https://github.com/vipstone/algori ...

  2. java 栈和队列实现迷宫代码_算法图解:如何用两个栈实现一个队列?

    本文已收录至 https://github.com/vipstone/algorithm <算法图解>系列. 队列和栈是计算机中两个非常重要的数据结构,经过前面的学习(<队列> ...

  3. 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...

    多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...

  4. 【剑指offer】用两个栈实现一个队列

    题目:两个栈实现一个队列. 栈的特点:先进后出,队列的特点是先进先出 思路:stack1放入数据:pop时,先判断stack2是否为空,如果不为空,直接pop,如果空,则push(stack1.pop ...

  5. 剑指offer五:两个栈实现一个队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. package com.jianzhioffer;import java.util.Stack;publ ...

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

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

  7. python 用两个栈实现一个队列

    | 两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素 ...

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

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

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

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

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

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

最新文章

  1. Mysql数据库权限问题
  2. MailScanner相关规则设置
  3. 快速失败(fail-fast)和安全失败(fail-safe)
  4. sudo apt-get update 出错 Updating from such a repository can‘t be done securely, and is therefore
  5. 【转】Python操作MongoDB数据库
  6. HTML property 和 attribute 的区别
  7. 前端:Vue前端开发规范,值得收藏!
  8. win10网卡高级属性配置图解_简单设置,win10再也不会断网了
  9. 汇编语言中常用指令对标志位寄存器的影响
  10. Android Fragment (一)
  11. 太大如何翻页固定表头_外行学 Python 爬虫 第六篇 动态翻页
  12. Atitit.软件仪表盘(2)--vm子系统--资源占用监测
  13. 一套适合入门的Oracle学习视频
  14. 英文站变现赚美金的7种方式
  15. 重启计算机可以使用什么组合键,死机重启电脑快捷键有哪些
  16. 深圳市计算机软件著作权资助,深圳市计算机软件著作权登记资助管理实施细则...
  17. 第0期-前言-学习软件测试是否需要培训
  18. 电子书 UNIX环境高级编程(第3版).pdf
  19. Android camera2 同时打开两颗物理摄像头
  20. b460m迫击炮黑苹果_黑苹果系列2 - 我的黑苹果配置

热门文章

  1. 数据结构与算法: Asymptotic Analysis 渐近分析
  2. 安装Windows刷机adb环境手册
  3. CFA难度:特许金融分析师CFA难考吗?
  4. 简单的html颜色选择器
  5. Python函数嵌套
  6. Apollo canbus模块学习笔记
  7. windows中判断注册表键值是否存在的一段函数
  8. 条形码技术应用属于计算机系统的,条形码技术在现代物流系统中的应用
  9. 【机器学习】K近邻(KNN)算法详解
  10. 高分meta分析质量评价方法