两个栈实现一个队列/两个队列实现一个栈
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代码实现
- import java.util.Stack;
- public class StacksToQueue
- {
- Stack<Integer> stack1=new Stack<Integer>() ;
- Stack<Integer> stack2=new Stack<Integer>();
- public void addToTail(int x)//添加元素到队尾 --进队---
- {
- stack1.push(x);
- }
- public int deleteHead()//删除对首 --出队--- 不需是队不为空才能删除呀~~~~
- {
- if( pSize()!=0)//队列不为空
- {
- if(stack2.isEmpty())//若stack2为空,则把stack1全部加入stack2
- stack1ToStack2();
- return stack2.pop();
- }
- else
- {
- System.out.println("队列已经为空,不能执行从队头出队");
- return -1;
- }
- }
- public void stack1ToStack2()//把stack1全部放入stack2
- {
- while(!stack1.isEmpty())
- stack2.push(stack1.pop());
- }
- public int pSize()//队列size()
- {
- return stack1.size()+stack2.size();//两个都为空队列才是空
- }
- }
2两个队列实现一个栈
入栈:将元素进队列A
出栈:判断队列A中元素的个数是否为1,如果等于1,则出队列,否则将队列A中的元素 以此出队列并放入队列B,直到队列A中的元素留下一个,然后队列A出队列,再把 队列B中的元素出队列以此放入队列A中。
- import java.util.LinkedList;
- public class QueuesToStack
- {
- LinkedList<Integer> queue1=new LinkedList<Integer>();
- LinkedList<Integer> queue2=new LinkedList<Integer>();
- public void push(int value)//入栈
- {
- queue1.addLast(value);
- }
- public int pop()//出栈 必须是非空的栈才能出栈啊
- {
- if(sSize()!=0)//栈不为空
- {
- //移动一个队的n-1个到另一个中
- if(!queue1.isEmpty())//q1 空
- {
- putN_1ToAnthor();
- return queue1.removeFirst();
- }
- else //q2 空
- {
- putN_1ToAnthor();
- return queue2.removeFirst();
- }
- }
- else
- {
- System.out.println("栈已经为空啦,不能出栈");
- return -1;
- }
- }
- public int sSize()
- {
- return queue1.size()+queue2.size();
- }
- public void putN_1ToAnthor()//从非空中出队n-1个到另一个队列 因为队列总是一空一非空
- {
- if(!queue1.isEmpty())
- {
- while(queue1.size()>1)
- {
- queue2.addLast(queue1.removeFirst());
- }
- }
- else if(!queue2.isEmpty())
- {
- while(queue2.size()>1)
- {
- queue1.addLast(queue2.removeFirst());
- }
- }
- }
- }
两个栈实现一个队列/两个队列实现一个栈相关推荐
- 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...
多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...
- JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作(《剑指offer》)
最近在刷<剑指offer>里的编程题,但是网上关于<剑指offer>的解答多半是C或者C++的,而且官方(作者)也是在用C++进行讲解,这里自己用java写了一些题目的解答代码 ...
- 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。...
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. import java.util.Stack; public class Solution { ...
- 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。...
算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...
- c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc
数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...
- 栈一:用两个栈实现队列
/** * 题目:用两个栈实现队列 * 描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. * 解决方案:方法一:一个作为存储用,一个作为弹出用 * * ...
- Java经典面试题:一个线程两次调用start()方法会出现什么情况?
大家好,我是 Oracle首席工程师杨晓峰. 今天想和大家深入聊聊线程,相信大家对于线程这个概念都不陌生,它是Java并发的基础元素,理解.操纵.诊断线程是Java工程师的必修课,但是你真的掌握线程了 ...
- redis stream java消息队列_Redis-消息队列的两种实现方式
索引: 基于list的实现方式 基于publish/subscribe 实战 消息队列简介 消息队列:是消息的顺序集合. 比如网站的PV统计和查看,传统方式就是每个页面发一个AJAX然后mysql给P ...
- 操作系统习题(有一个具有两道作业的批处理系统)
题目描述: 有一个具有两道作业的批处理系统,作业调度采用短作业优先的调度算法,进程调度采用以优先数为基础的抢占式调度算法,在下表所示的作业序列,作业优先数即为进程优先数,优先数越小优先级越高.(1)列 ...
最新文章
- 京东员工怒怼公司:每天工作到很晚甚至凌晨,你跟我说这是幸福?
- android第九步文件的保存和读取
- docker-compose安装mongodb
- Java三维数组的使用
- 如何对Windows Server 2008上的ARP缓存进行管理
- Java笔试面试题001
- 第九届蓝桥杯题解(部分)
- 魔兽争霸III背景渊源
- 基于锁的并发数据结构
- php满一百人随机发放奖品,php按照奖品百分比随机抽奖 阿星小栈
- python求小于n的所有素数_python - 列出N以下所有素数的最快方法 - 堆栈内存溢出...
- SAP UI5 应用开发教程之一百 - 如何修改 SAP UI5 框架的源代码实现,以及使用本地部署的 SAP UI5 SDK 试读版
- 微信签到 表单 mysql_java做的一个简易的微信签到系统
- emplace_back()
- 系列二 帶丄耳機全丗屆跟莪沒關係
- 计算构成三角形的个数
- 电影海报页面设计Html5,HTML5 电影海报模板
- 怎么在服务器上加端口映射,教你怎么开服务器(路由端口映射)
- 数商云SCM供应链协同系统库存管理解决方案,助力家居建材企业库存精细化管理
- css中inherit和initial的区别
热门文章
- poj-2955-Brackets-区间DP
- 一张大图片有多个小图片
- 夺命雷公狗---ECSHOP---08---商品页的拇改成星星
- iOS判断为空或者只为空格
- UI测试脸型软件,App脸型美化剖析|UI-影视-其他|观点|freshoil - 原创文章 - 站酷 (ZCOOL)...
- oracle数据库swap占用率高,物理内存空余很多,swap被持续占用的问题
- mysql什么实务_MysQL是什么类型的据库?
- 简述select语句的完整语法_SQL里的各种语句的完整语法
- maya崩溃自动保存路径_maya 使用swig将插件编译成pyd,无缝使用内置数据实现加速计算模块...
- linux内核删不掉,linux 删除内核文件,未能启动,修复方法 CDROM与网络法