您的位置:首页 > 其它

队列-循环队列

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的消息队列的数据结构 时
双端队列
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: