关闭

队列-循环队列

标签: 数据结构-java
86人阅读 评论(0) 收藏 举报
分类:

循环队列

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的消息队列的数据结构 时双端队列

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:923次
    • 积分:123
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论