队列-循环队列
2016-06-02 01:14
323 查看
循环队列
1.介绍
队列就是一个能够实现FIFO (先进先出)的存储结构。队列分为链式队列和静态队列;
静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。
这里讲的是循环队列
2.性质
队列初始化时,head和tail值都为零当队列不为空时,head指向队列的第一个元素,tail指向队列最后一个元素的下一个位置
当队列为空时,head与tail的值相等,但不一定为零
当队列满时,(tail+1)%size==head
3.操作
构造函数初始化队列isQueueEmpty()——判断队列是否为空
isQueueFull() ——判断队列是否已满
enQueue() ——进队列
deQueue() ——出队列
4.代码
数组实现package com.tjp.structure; /** * 循环队列(数组实现) * Created by TJP on 2016/6/1. */ public class CircularQueue { /** * 队列长度 */ private int size; /** * 循环队列数组 */ private int[] elements; /** * 头部 */ private int head; /** * 尾部 */ private int tail; /** * 初始化队列 */ public CircularQueue(int size) { this.head = 0; this.tail = 0; this.size = size; elements = new int[size]; } /** * 进队列(尾部) */ public void enQueue(int key) { if (isQueueFull()) { System.out.println("queue is full , wait a mement"); } else { elements[tail] = key; tail = (tail + 1) % size; } } /** * 出队列(头部) * * @return */ public int deQueue() { int e = 0; if (isQueueEmpty()) { System.out.println("queue is empty"); } else { e = elements[head]; head = (head + 1) % size; } return e; } /** * 判断队列是否为空 */ public boolean isQueueEmpty() { if (head == tail) { return true; } return false; } /** * 判断队列是否已满 */ public boolean isQueueFull() { if ((tail + 1) % size == head) { return true; } return false; } public int getHead() { return head; } public int getTail() { return tail; } public static void main(String args[]) { CircularQueue queue = new CircularQueue(6); //一开始队为空 System.out.println(queue.isQueueEmpty()); queue.enQueue(1); queue.enQueue(2); queue.enQueue(3); queue.enQueue(4); queue.enQueue(5); //队满 System.out.println(queue.isQueueFull());//true //出队一个 System.out.println(queue.deQueue());//1出队列 System.out.println(queue.getHead());//head:0--->1 //入队一个 queue.enQueue(6); System.out.println(queue.getTail());//tail:5--->0 System.out.println(queue.isQueueFull());//true 队列满 //队满加不了 queue.enQueue(7); } }
5.拓展
结合java的utils里的队列实现kafka 、mq的消息队列的数据结构 时
双端队列
相关文章推荐
- 谈谈iOS网络编程之socket编程技术及应用
- Linux及安全实践三——程序破解
- 33 Spark worker原理与源码
- 抛弃EF,20分构建一个属于自己的ORM框架
- retain assign copy在@propeerty中的使用实际上是通过控制set方法进行内存管理
- Atom 编辑器 入门 快捷键 插件
- 人生的灯塔--写在25岁之后
- OC类的扩展总结
- Java设计模式——装饰者模式
- Ubuntu Server 14.04在VMware安装的一些事儿
- HUE的简单介绍
- SQL脚本
- [Java Concurrent] 并发访问共享资源的简单案例
- Python-Matplotlib安装及简单使用
- 跟我一起学习MySQL技术内幕(第五版):(第三章学习日记13)
- hdu1087
- 多线程下载并且实现断点下载
- Android_自定义View拖拽重绘
- leetcode 322. Coin Change
- 查看.class文件的版本号