http://blog.csdn.net/sinat_30472685/article/details/70157227

1两个栈实现一个队列

1.原理分析:

队列的主要操作有两个:入队操作和出队操作,出队时从队头出,入队是从队尾插入,入队的操作和入栈的操作类似,而最关键的问题是出队操作,要出队列的是队列的第一个元素,而出栈的是栈的栈顶元素,所以我们可以这样:

假设两个栈A和栈B,A主要用来处理入队操作,B用于处理出队操作。入队操作和入栈操作类似,直接将元素压入栈即可。出队的时候,实现我们假设栈B为空,则要把栈A的第一个元素(即栈底元素)弹出,直接从A弹出这是不可能的,但如果我们把栈A里面的元素的顺序逆过来,这样直接用栈弹出栈顶元素即可,所以我们可以把栈A的元素全部弹出来,并俺顺序压入栈B中,这样每次栈B弹出的栈顶元素就是栈A相对应的栈底元素,就是出队操作。若B不为空,则代表之前从A复制过来的元素还没有完全弹出,要出栈的时候直接弹出即可。若栈B的元素都弹出来了,就需要从A中补充。

2.总结操作就是:

入队:将元素进栈A

出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈;如果不为空,栈B直接出栈。

3.Java代码实现

  1. import java.util.Stack;
  2. public class StacksToQueue
  3. {
  4. Stack<Integer> stack1=new Stack<Integer>() ;
  5. Stack<Integer> stack2=new Stack<Integer>();
  6. public void addToTail(int x)//添加元素到队尾   --进队---
  7. {
  8. stack1.push(x);
  9. }
  10. public int deleteHead()//删除对首      --出队---    不需是队不为空才能删除呀~~~~
  11. {
  12. if( pSize()!=0)//队列不为空
  13. {
  14. if(stack2.isEmpty())//若stack2为空,则把stack1全部加入stack2
  15. stack1ToStack2();
  16. return  stack2.pop();
  17. }
  18. else
  19. {
  20. System.out.println("队列已经为空,不能执行从队头出队");
  21. return -1;
  22. }
  23. }
  24. public void stack1ToStack2()//把stack1全部放入stack2
  25. {
  26. while(!stack1.isEmpty())
  27. stack2.push(stack1.pop());
  28. }
  29. public int pSize()//队列size()
  30. {
  31. return  stack1.size()+stack2.size();//两个都为空队列才是空
  32. }
  33. }

2两个队列实现一个栈

1.原理分析:
栈的主要操作有两个:入栈操作和出栈操作,出栈时从栈顶出,入栈是从栈顶插入。入栈和入队类似,都是从“所有元素后面插入”;而最关键的问题是出栈操作,要出栈的是的栈顶元素,而队列每次出队的是队列的第一个元素。因此我们可以这样,出队的时候,若队列不止一个元素,则进行出队 操作,只保留最后一个元素,这样出队的时候,就符合出栈的要求了,但其他的元素必须 保留,而且顺序不能乱,这时候另一个队列就起作用了,这个队列可以在“出栈”操作之前按顺序保留所有的元素,等到“出栈”之后,把所有元素按顺序进入到“出栈”后的队列。因此两个队列总有一个为空。
2.总结操作就是:

入栈:将元素进队列A

出栈:判断队列A中元素的个数是否为1,如果等于1,则出队列,否则将队列A中的元素  以此出队列并放入队列B,直到队列A中的元素留下一个,然后队列A出队列,再把  队列B中的元素出队列以此放入队列A中。

3.Java代码实现:
  1. import java.util.LinkedList;
  2. public class QueuesToStack
  3. {
  4. LinkedList<Integer> queue1=new LinkedList<Integer>();
  5. LinkedList<Integer> queue2=new LinkedList<Integer>();
  6. public void push(int value)//入栈
  7. {
  8. queue1.addLast(value);
  9. }
  10. public int pop()//出栈     必须是非空的栈才能出栈啊
  11. {
  12. if(sSize()!=0)//栈不为空
  13. {
  14. //移动一个队的n-1个到另一个中
  15. if(!queue1.isEmpty())//q1 空
  16. {
  17. putN_1ToAnthor();
  18. return queue1.removeFirst();
  19. }
  20. else  //q2 空
  21. {
  22. putN_1ToAnthor();
  23. return queue2.removeFirst();
  24. }
  25. }
  26. else
  27. {
  28. System.out.println("栈已经为空啦,不能出栈");
  29. return -1;
  30. }
  31. }
  32. public int sSize()
  33. {
  34. return queue1.size()+queue2.size();
  35. }
  36. public void putN_1ToAnthor()//从非空中出队n-1个到另一个队列   因为队列总是一空一非空
  37. {
  38. if(!queue1.isEmpty())
  39. {
  40. while(queue1.size()>1)
  41. {
  42. queue2.addLast(queue1.removeFirst());
  43. }
  44. }
  45. else if(!queue2.isEmpty())
  46. {
  47. while(queue2.size()>1)
  48. {
  49. queue1.addLast(queue2.removeFirst());
  50. }
  51. }
  52. }
  53. }

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

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

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

  2. JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作(《剑指offer》)

    最近在刷<剑指offer>里的编程题,但是网上关于<剑指offer>的解答多半是C或者C++的,而且官方(作者)也是在用C++进行讲解,这里自己用java写了一些题目的解答代码 ...

  3. 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。...

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

  4. 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。...

    算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...

  5. c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc

    数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...

  6. 栈一:用两个栈实现队列

    /**  * 题目:用两个栈实现队列  * 描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.  * 解决方案:方法一:一个作为存储用,一个作为弹出用  * * ...

  7. Java经典面试题:一个线程两次调用start()方法会出现什么情况?

    大家好,我是 Oracle首席工程师杨晓峰. 今天想和大家深入聊聊线程,相信大家对于线程这个概念都不陌生,它是Java并发的基础元素,理解.操纵.诊断线程是Java工程师的必修课,但是你真的掌握线程了 ...

  8. redis stream java消息队列_Redis-消息队列的两种实现方式

    索引: 基于list的实现方式 基于publish/subscribe 实战 消息队列简介 消息队列:是消息的顺序集合. 比如网站的PV统计和查看,传统方式就是每个页面发一个AJAX然后mysql给P ...

  9. 操作系统习题(有一个具有两道作业的批处理系统)

    题目描述: 有一个具有两道作业的批处理系统,作业调度采用短作业优先的调度算法,进程调度采用以优先数为基础的抢占式调度算法,在下表所示的作业序列,作业优先数即为进程优先数,优先数越小优先级越高.(1)列 ...

最新文章

  1. 京东员工怒怼公司:每天工作到很晚甚至凌晨,你跟我说这是幸福?
  2. android第九步文件的保存和读取
  3. docker-compose安装mongodb
  4. Java三维数组的使用
  5. 如何对Windows Server 2008上的ARP缓存进行管理
  6. Java笔试面试题001
  7. 第九届蓝桥杯题解(部分)
  8. 魔兽争霸III背景渊源
  9. 基于锁的并发数据结构
  10. php满一百人随机发放奖品,php按照奖品百分比随机抽奖 阿星小栈
  11. python求小于n的所有素数_python - 列出N以下所有素数的最快方法 - 堆栈内存溢出...
  12. SAP UI5 应用开发教程之一百 - 如何修改 SAP UI5 框架的源代码实现,以及使用本地部署的 SAP UI5 SDK 试读版
  13. 微信签到 表单 mysql_java做的一个简易的微信签到系统
  14. emplace_back()
  15. 系列二 帶丄耳機全丗屆跟莪沒關係
  16. 计算构成三角形的个数
  17. 电影海报页面设计Html5,HTML5 电影海报模板
  18. 怎么在服务器上加端口映射,教你怎么开服务器(路由端口映射)
  19. 数商云SCM供应链协同系统库存管理解决方案,助力家居建材企业库存精细化管理
  20. css中inherit和initial的区别

热门文章

  1. poj-2955-Brackets-区间DP
  2. 一张大图片有多个小图片
  3. 夺命雷公狗---ECSHOP---08---商品页的拇改成星星
  4. iOS判断为空或者只为空格
  5. UI测试脸型软件,App脸型美化剖析|UI-影视-其他|观点|freshoil - 原创文章 - 站酷 (ZCOOL)...
  6. oracle数据库swap占用率高,物理内存空余很多,swap被持续占用的问题
  7. mysql什么实务_MysQL是什么类型的据库?
  8. 简述select语句的完整语法_SQL里的各种语句的完整语法
  9. maya崩溃自动保存路径_maya 使用swig将插件编译成pyd,无缝使用内置数据实现加速计算模块...
  10. linux内核删不掉,linux 删除内核文件,未能启动,修复方法 CDROM与网络法