首页 > 编程语言 > 详细

Java数据结构与算法(3):队列

时间:2019-10-04 16:34:35      阅读:72      评论:0      收藏:0      [点我收藏+]

队列也是一种表,不同的是队列在一端进行插入而在另一端进行删除。

队列模型

技术分享图片

队列的基本操作包括入队、出队操作。在表的末端插入元素,在表的开头删除元素,即先进先出(FIFO)。

队列的数组实现

对于每一个队列数据结构,保留一个数组items以及位置front和back,分别表示队列的两端,还要记录元素的个数size。操作过程应该是:当一个元素x入队,size和back增1,置items[back]=x;出队时,返回items[front],size减1,然后front增1。

初始队列:
技术分享图片

入队:
技术分享图片

出队:
技术分享图片

由于数组是有边界的,上述过程重复多次后,可能出现back已经是数组的最后一个下标了,而数组中经过多次出队操作可能剩下很少甚至没有元素了,解决方式是只有front或back到达数组的尾端,它就又绕回到开头,这叫做循环数组实现。
初始状态:
技术分享图片

1次入队后:
技术分享图片

2次入队后:
技术分享图片

1次出队后:
技术分享图片

2次出队后:
技术分享图片

3次出队后:
技术分享图片

4次出队后:
技术分享图片

代码示例

关于队列,最终的就是入队和出队操作,这里使用队首和队尾与数组长度的关系判断队列是否为空、是否已满:

public class MyArrayQueue<T> {
    private int front;
    private int back;
    private T[] items;
    private static final int DEFAULT_CAPACITY = 10;

    public MyArrayQueue() {
        this(DEFAULT_CAPACITY);
    }

    public MyArrayQueue(int size) {
        front = back = 0;
        items = (T[]) new Object[size];
    }

    public boolean isEmpty() {
        return front == back;
    }

    public void enqueue(T x) throws Exception {
        if ((back + 1) % items.length == front) {
            throw new Exception("队列已满");
        }
        items[back] = x;
        back = back % items.length + 1;
    }

    public T dequeue() throws Exception {
        if (back % items.length == front) {
            throw new Exception("队列为空");
        }
        T x = items[front];
        front = front % items.length + 1;
        return x;
    }
}

Java数据结构与算法(3):队列

原文:https://www.cnblogs.com/xiaoxiaoyihan/p/11611748.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!