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

栈模拟队列

首先我们定义两个栈,一个放数据,一个出数据,判断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. Unity 双击Esc或者返回退出游戏,有文字提示

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

  2. NodeJS 开发应用

    NodeJS 开发应用 使用的 Node 版本: V8.11.4 开发工具: VSCode 1.27.1 系统: Deepin 15.7 Desktop x64 项目结构 项目结构 Project i ...

  3. DB2错误码大全

    sqlcode sqlstate 说明 000 00000 SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 +012 01545 未限定的列名被解释为一个有相互关系的引用 +098 0 ...

  4. CentOS7中添加新硬盘

      cp /etc/fstab /etc/fstab.bak echo /dev/vdb1 /mnt/disk1 ext4 defaults 0 0 >> /etc/fstab mkdir ...

  5. hystrix应用介绍(三)

    hystrix提供了两种隔离策略:线程池隔离和信号量隔离.hystrix默认采用线程池隔离. 1.线程池隔离 不同服务通过使用不同线程池,彼此间将不受影响,达到隔离效果. 例如: 我们可以通过andT ...

  6. Eureka与ZooKeeper 的比较

    Eureka的优势 1.在Eureka平台中,如果某台服务器宕机,Eureka不会有类似于ZooKeeper的选举leader的过程:客户端请求会自动切换到新的Eureka节点:当宕机的服务器重新恢复 ...

  7. java webServer(一)

    java webServer实现 浏览器和服务器使用的是http协议,http协议使用的是tcp 这里主要在服务器端监听端口号 实现功能 通过浏览器向服务器发送http请求:http://localh ...

  8. svg保存为图片下载到本地

    今天给大家说一个将svg下载到本地图片的方法,这里我不得不吐槽一下,为啥博客园不可以直接上传本地文件给大家用来直接下载分享呢,好,吐槽到此为止! 这里需要用到一个js文件,名字自己起,内容如下: (f ...

  9. CSS改变placeholder的颜色

    :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #a1a1a1; } ::-moz-placeholder { /* Mozilla ...

  10. 图片延迟插件 Jquery.lazyload.min.js

    当一个页面打开的图片太多,我们可以用jquery的一个延迟加载插件.名为:jquery.lazyload.min.js 使用非常简单,如下: <div style="height:70 ...