栈的规律是是先进后出 队列的规律是先进先出

栈模拟队列

首先我们定义两个栈,一个放数据,一个出数据,判断B栈是否有元素,有元素则直接pop;没有元素则需要我们将A里面的元素出栈然后放到B里面,再取出,即实现队列的先进先出

最初思路想法

    使用A和B两个栈来模拟队列,一个为入栈一个为出栈,这样来实现队列

    两个栈stack1,stack2 入队在stack2.如果入队时stack2 不为空,那么stack2必须先清空(数据迁移到stack1 ),如果出对时stack2不为空,直接出栈。如果stack2为空,则需要把stack1中的数据全部转移到stack2中

修正后思路想法

利用两个栈S1和S2来模拟一个队列,当需要向队列中插入一个元素时,用S1来存放已经输入的元素,即S1执行入栈操作,当需要出队时,则对S2执行出栈操作。由于从栈中取出元素的顺序是原顺序的逆序,所以先将S1的所有元素全部出栈并入栈到S2中,再在S2中齿形出栈操作,就能实现出队操作,而在执行此操作之前,先判断S2是否为空,否则会导致顺序混乱,当栈S1和S2都为空时队列为空。

代码实现


import java.util.Stack; /**
* 使用两个栈来模拟队列
* @author legend
* @param <E>
*
*/
public class MyQueue<E> {
/**
* 使用Java类库里面的stack定义两个栈 一个用于出栈一个用于入栈
*/
private Stack<E> stack = new Stack<E>();
private Stack<E> stack2 = new Stack<E>(); /**
* 入栈和出栈是为了增加线程安全 使用了同步
*/
public synchronized void put(E data) {
stack.push(data);
} public synchronized E pop() {
//如果栈2为空,则把栈1里面的数据压到2里面,在出栈,即实现队列 若不为空,那么stack2中元素弹出(出列),若为空则提示队列为空
if(stack2.isEmpty()) {
while(!stack.isEmpty()) {
stack2.push(stack.pop());
return stack2.pop();
}
}
//否则直接出栈,实现栈对模拟队列
return stack2.pop();
} public static void main(String[] args) { MyQueue<Integer> myQueue = new MyQueue<Integer>(); myQueue.put(1);//第一元素
myQueue.put(2);//第二元素
myQueue.put(3);//第三元素 System.out.println("栈模拟队列后head的数据"+myQueue.pop());
}
}

2,队列模拟栈


两个队列q1,q2 入栈在q1,。q2作为一个缓冲队列。 出栈时,将q1除最后一个外,全部入队列q2。q1出队即是出栈。

2018.9.5 Java中使用栈来模拟队列的更多相关文章

  1. 浅谈Java中的栈和堆

    人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中? 这里浅谈Java中的栈和堆 首先,将结论写在前面,后面再用例子加以验证. Java的栈中存储以下类型数 ...

  2. 如何给女朋友讲明白:Java 中 Stack(栈) 与 Heap(堆)

    背景 Java 中 Stack(栈) 与 Heap(堆) 是面试中被经常问到的一个话题. 有没有对 Java 中 Stack(栈) 与 Heap(堆) 烂熟于心的童鞋,请举手!!!(怎么没人举手-) ...

  3. Java中的栈,堆,方法区和常量池

    要说Java中的栈,堆,方法区和常量池就要提到HotSpot,HotSpot是Sun JDK 和 Open JDK中所带的虚拟机. (Sun JDK 和 Open JDK除了注释不同,代码实现基本上是 ...

  4. java中的栈(利用数组实现栈)

    java中的栈(利用数组实现栈) 常见的数据结构:https://blog.csdn.net/weixin_43304253/article/details/119764275 栈的介绍 1.栈的英文 ...

  5. Java中 堆 栈,常量池等概念解析(转载)

    1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符 ...

  6. 2018.8.3 Java中容易犯错误的问题思考与总结

    Java容易犯错误的问题思考 float型 float f = 3.4 是否正确 不正确,应该用强制类型转换.如下所示:float f = (float)3.4 或float f = 3.4f 在ja ...

  7. 2018.2.2 java中的Date如何获取 年月日时分秒

    package com.util; import java.text.DateFormat; import java.util.Calendar; import java.util.Date; pub ...

  8. java中的栈Stack

    Stack:栈是一种只能在一端进行插入或删除操作的线性表.(先进后出表) java中的Stack继承Vector 实例化 Stack stack=new Stack(); 基本使用 判断是否为空 st ...

  9. 2018.8.1 Java中的反射和同步详解

    为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他 ...

随机推荐

  1. 5-----Scrapy框架中Spiders用法

    Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 1.以初始的URL初始化Request, ...

  2. java——哈希表 HashTable

    在一个类中重写hashCode()和equals() package Date_pacage.hash; public class Student { private int grade; priva ...

  3. jdk源码分析——java.lang.Boolean

      1.Boolean类里面的2个静态变量. Boolean类,直接声明了2个静态变量,TRUE 和 FALSE,指向2个对象.     public static final Boolean TRU ...

  4. linux 安装dubbo+zookeeper

    dubbo+zookeeper 启动成功 注意:dubbo-admin-2.5.4 不支持java8

  5. Unity 双击Esc或者返回退出游戏,有文字提示

    第一次点击Esc或者返回,显示提示文字"再次按下返回键退出游戏",在文字消失之前再次点击Esc或者返回,退出游戏. 此脚本挂在Text文字提示上: using UnityEngin ...

  6. centOS和redHat防火墙开放端口

    发现在CentOS 7上开放端口用iptables没效果(或者是sodino没找到正确的命令,传说Centos7 下默认的防火墙是 Firewall,替代了之前的 iptables)… 使用firew ...

  7. (转)ssh-keygen 中文手册

    ssh-keygen 中文手册 原文:http://www.jinbuguo.com/openssh/ssh-keygen.html 实例:http://blog.csdn.net/yl_1314/a ...

  8. JavaScript DOM基础总结

    上个月在进行百度三面时候,面试官提问JavaScript DOM方法,我回答的有点少,前面太关注JavaScript 兼容性,框架方面,JavaScript 原生DOM基础没有记牢,心中有点遗憾.下来 ...

  9. Emacs学习笔记1

    Emacs笔记-Emacs基本的文本操作 使用命令时要在minibuffer缓冲区中 关于文件 注意 在对单词的操作中C开头的控制范围要比M开头的控制范围要下 对于文件的撤销操作, 不要使用C-x, ...

  10. POJ 1182——食物链——————【种类并查集】

    食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status P ...