数据结构(三)队列 Queue

1 队列模型

1.1 定义

队列(queue)是插入在一端进行而删除在另一端进行的表
先进先出(FIFO)表

1.2 基本操作

enqueue(入队):在队尾(rear)插入元素
dequeue(出队):删除队头(front)的元素

1.3 特性

以常数时间运行

2 队列的实现

2.1 队列的链表实现

package chapter2.queue.queue_linkedList;

import chapter2.linkedList.MyLinkedList;

public class LinkedListQueue {
    private int size;
    private MyLinkedList linkedList;

    LinkedListQueue() {
        linkedList = new MyLinkedList();
        size = 0;
    }

    /**
     * 入队
     *
     * @param element 入队的元素
     */
    public void enqueue(Object element) {
        linkedList.add(element);
        size++;
    }

    /**
     * 出队
     *
     * @return 出队的元素
     */
    public Object dequeue() {
        if (isEmpty()) {
            System.out.println("队列为空!");
            return null;
        }
        size--;
        return linkedList.remove(0);
    }

    /**
     * 获取队头元素
     *
     * @return 队头元素
     */
    public Object first() {
        if (isEmpty()) {
            System.out.println("队列为空!");
            return null;
        }
        return linkedList.get(0);
    }

    /**
     * 获取队列长度
     *
     * @return 队列长度
     */
    public int size() {
        return size;
    }

    /**
     * 判断队列是否为空
     *
     * @return true/false
     */
    public boolean isEmpty() {
        return size == 0;
    }
}

测试类

package chapter2.queue.queue_linkedList;

public class TestQueue {
    public static void main(String args[]) {
        LinkedListQueue linkedListQueue = new LinkedListQueue();
        linkedListQueue.enqueue("one");
        linkedListQueue.enqueue("two");
        linkedListQueue.enqueue("three");
        System.out.println("dequeue:" + linkedListQueue.dequeue());
        System.out.println("size:" + linkedListQueue.size());
        System.out.println("empty:" + linkedListQueue.isEmpty());
        System.out.println("first:" + linkedListQueue.first());
        linkedListQueue.dequeue();
        linkedListQueue.dequeue();
        System.out.println("empty:" + linkedListQueue.isEmpty());
        linkedListQueue.dequeue();
    }
}

输出

dequeue:one
size:2
empty:false
first:two
empty:true
队列为空!

2.2 队列的数组实现

package chapter2.queue.queue_array;

public class ArrayQueue {
    private int size;   //队伍长度
    private int front;  //队头位置
    private int back;   //队尾位置
    private Object[] elements;
    private static final int CAPICITY = 100;    //最大容量

    ArrayQueue() {
        size = 0;
        front = 0;
        back = -1;
        elements = new Object[CAPICITY];
    }

    /**
     * 入队
     *
     * @param element 入队的元素
     */
    public void enqueue(Object element) {
        if (back == CAPICITY - 1) {
            System.out.println("队列已满");

            return;
        }
        size++;     //队伍长度增加1
        back++;     //队尾移到下一位
        elements[back] = element;
    }

    /**
     * 出队
     *
     * @return 出队的元素
     */
    public Object dequeue() {
        if (isEmpty()) {
            System.out.println("队列为空!");
            return null;
        }
        size--;     //队伍长度减少1
        Object element = elements[front];
        front++;    //队头移到下一位
        return element;
    }

    /**
     * 获取队头元素
     *
     * @return 队头元素
     */
    public Object first() {
        if (isEmpty()) {
            System.out.println("队列为空!");
            return null;
        }
        return elements[front];
    }


    /**
     * 获取队列长度
     *
     * @return 队列长度
     */
    public int size() {
        return size;
    }

    /**
     * 判断队列是否为空
     *
     * @return true/false
     */
    public boolean isEmpty() {
        return size == 0;
    }
}

测试类

package chapter2.queue.queue_array;

public class TestQueue {
    public static void main(String args[]) {
        ArrayQueue arrayQueue = new ArrayQueue();
        arrayQueue.enqueue("one");
        arrayQueue.enqueue("two");
        arrayQueue.enqueue("three");
        System.out.println("dequeue:" + arrayQueue.dequeue());
        System.out.println("size:" + arrayQueue.size());
        System.out.println("empty:" + arrayQueue.isEmpty());
        System.out.println("first:" + arrayQueue.first());
        arrayQueue.dequeue();
        arrayQueue.dequeue();
        System.out.println("empty:" + arrayQueue.isEmpty());
        arrayQueue.dequeue();
    }
}

输出

dequeue:one
size:2
empty:false
first:two
empty:true
队列为空!

猜你喜欢

转载自blog.csdn.net/gtx1502/article/details/81541530