题目描述

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

题目代码

/**
* <分析>:
* 入队:将元素进栈A
* 出队:判断栈B是否为空,
* 如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈;
* 如果不为空,栈B直接出栈。
* Created by YuKai Fan on 2018/8/20.
*/
public class TwoStackToAchieveQueue {
Stack<Integer> stack1 = new Stack<>();
Stack<Integer> stack2 = new Stack<>(); public static void main(String[] args) {
TwoStackToAchieveQueue twtaq = new TwoStackToAchieveQueue();
twtaq.push(1);
twtaq.push(2);
twtaq.push(3);
System.out.println(twtaq.pop());
System.out.println(twtaq.pop());
twtaq.push(4);
System.out.println(twtaq.pop());
System.out.println(twtaq.pop());
twtaq.push(5);
System.out.println(twtaq.pop()); }
/*
push方法,直接将值push到stack1中
*/
public void push(int node) {
stack1.push(node);
} /*
pop方法,先判断stack2是否为空,
如果不为空的话,直接返回stack2的栈顶,
如果为空,就将stack1中的元素,压入stack2中,然后返回弹出stack2的元素 为什么要判断是否为空,这里用main方法中的数据来解释?
当向stack1中压入三个数时,此时stack1中的数据结构为
|3|
|2|
|1|
之后执行两次pop操作,因为stack2为空,所以将stack1中的值压入stack2中。此时stack1中的元素为空,stack2的数据结构为:
|1|
|2|
|3|
执行两次结束后返回stack2中的栈顶元素,所以打印出来1,2。此时stack2的数据结构为:
|3|
再往下执行push(4),此时stack1中的数据结构为:
|4|
在执行一次pop,但是此时stack2是不为空的,如果不加入判断,就会将4压入栈顶,在pop的话,出来的就是4而不是3,所以需要判断stack2是否为空,如果不为空就直接弹出栈顶元素
所以此时应该打印3
接下来有执行一次pop,此时stack2由于上一次的pop操作,此时为空,所以将stack1中的4弹出并压入stack2,然后在弹出stack2的元素,所以此时打印4
最后的两次操作也是同样的道理
*/
public int pop() {
if (stack1.empty() && stack2.empty()) {
throw new RuntimeException("Queue is empty!");
}
if (stack2.empty()) {
int l = stack1.size();
for (int i = 0; i < l; i++) {
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}

题目延伸

用两个队列实现一个栈的功能?要求给出算法和思路!

/**
* 将queue1用作进栈出栈,queue2作为一个中转站
* 入栈时,直接压入queue1中出栈时,先将queue1中的元素除最后一个元素外依次出队列,并压入队列queue2中,
* 将留在queue1中的最后一个元素出队列即为出栈元素,最后还要把queue2中的元素再次压入queue1中
*
* Created by YuKai Fan on 2018/8/20.
*/
public class TwoQueueToStack {
LinkedList<Integer> queue1 = new LinkedList<>();
LinkedList<Integer> queue2 = new LinkedList<>(); public static void main(String[] args) throws Exception {
TwoQueueToStack tqts = new TwoQueueToStack();
tqts.push(1);
tqts.push(2);
tqts.push(3);
tqts.push(4);
tqts.push(5);
System.out.println(tqts.pop());
System.out.println(tqts.pop());
System.out.println(tqts.pop());
System.out.println(tqts.pop());
System.out.println(tqts.pop());
} public void push(int node) {
queue1.addLast(node);
} public int pop() throws Exception {
if (queue1.isEmpty() && queue2.isEmpty()) {
throw new Exception("queue is empty");
}
if (queue1.size() == 1) {
return queue1.poll();
} else {
//如果在出列queue1最后一个元素时,又在queue1入列元素就会,发生元素顺序错乱
while (queue1.size() != 1) {
queue2.add(queue1.poll());
}
int m = queue1.poll();
while (!queue2.isEmpty()) {
queue1.add(queue2.poll());
}
return m;
}
} }

java基础编程——用两个栈来实现一个队列的更多相关文章

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

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

  2. 面试题9-用两个栈来实现一个队列,完成队列的Push和Pop操作

    题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 一个栈压入元素,而另一个栈作为缓冲,将栈1的元素出栈后压入栈2中 代码 import java.ut ...

  3. 两个栈来实现一个队列的C++代码

    利用两个栈来实现一个队列, 这个问题非经常见.  最关键的是要有好的思路, 至于实现, 那是非常easy的事情了. 在本文中, 也想说说自己的思路, 可是. 我认为用代码来表述思路更符合我的习惯. 也 ...

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

    1. 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 2. 思想 (1)栈的特点是先进后出,而队列的特点是先进先出: (2)因此,入队列的情况和入栈的情 ...

  5. 剑指offer-用两个栈来实现一个队列-队列与栈-python

    用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路:使用两个栈,stackA 用来接收node stackB 用来接收 stackA 的出栈 # -*- cod ...

  6. 使用两个栈来完成一个队列,需要是实现的功能有add,poll.peek

    2017-06-23 19:15:16 队列时先进先出型,而栈是先进后出型,这就需要建立一个联系.我想到的一个简单的表示方式是: 这样就需要两个栈,栈1是用来实现add操作,即直接push进去就行:栈 ...

  7. 一张图展示:用两个栈来实现一个队列,完成队列的Push和Pop操作

    一  基本思路 将s1作为存储空间,以s2作为临时缓冲区. 入队时,将元素压入s1. 出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒 ...

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

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

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

    public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer&g ...

随机推荐

  1. 【Kafka】《Kafka权威指南》入门

    发布与订阅消息系统 在正式讨论Apache Kafka (以下简称Kafka)之前,先来了解发布与订阅消息系统的概念, 并认识这个系统的重要性.数据(消息)的发送者(发布者)不会直接把消息发送给接收 ...

  2. [WebShow系列] Web浏览器最大化满屏及比例缩放方法

    如果要在大屏上展示,大屏所带电脑的浏览器应该处于满屏,此时就不会显示浏览器软件的边框了.个别浏览器在满屏状态下,某些边栏等还继续保留,此时应设置此浏览器的显示选项方可消除. 如果屏幕中的显示对象过小或 ...

  3. shell学习(11)- seq

    今天是五一劳动节,窗户外边,草长莺飞,惠风和畅,但坐在办公室里值班也需要做点事情,今天就写写seq的用法. 作用:用于以指定增量从首数开始打印数字到尾数,即产生从某个数到另外一个数之间的所有整数,并且 ...

  4. tomcat memecached session 共享同步问题的解决

    事件缘由:一个主项目“图说美物”,另外一个子功能是品牌商的入驻功能,是跟主项目分开的项目,为了共享登录的用户信息,而实现session共享,俩个tomcat,一个tomcat6,一个tomcat7 w ...

  5. ACM 大神的经验加技巧(当然不是我的拉——

    大神 犯错合集及需要注意的东西 1.在一个地图求最大面积的类问题中,要注意障碍结点的影响. 2.ll(),表示的是在运算后把括号内强制转化为类型ll,而(ll)表示后面的每个玩意都强制转化为类型ll. ...

  6. gogs迁移

    windows->linux 之前gogs放在windows server2016中,需要迁移至linux docker中. 首先拉取gogs镜像 docker pull gogs/gogs 然 ...

  7. Dijkstra算法(求一点到任意一点的最短距离)

    思路:先找出最短的一个点,也就是起点,从起点出发,找最短的边,同时标记起点为true(代表已经访问过),访问过的点就不用再访问了,依次下去,保证每一次找到的边都是最短的边 到最后没有边可以更新了就代表 ...

  8. FZU Problem 2244 Daxia want to buy house

    模拟题,注意: 1.那两个贷款都是向银行贷的,就是两个贷款的总额不能超过70%,就算公积金贷款能贷也不行,我开始的时候以为公积金贷款是向公司借的,,欺负我这些小白嘛.... 2.最坑的地方 *0.7是 ...

  9. postman将上一个请求的结果作为下一个请求的数据

    需要在Tests中写入如下代码: var jsonData = JSON.parse(responseBody); postman.setGlobalVariable("token" ...

  10. 【Linux】linux压缩和解压缩命令大全

    tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName gz命令 解压1:gunzip FileName.gz 解压2:gzip ...