队列

队列的定义

  队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

  可以直接理解成隧道,这头进,那头出。

 

  数据呈现方式如图:

  和栈一样,队列这种结构也是属于逻辑结构,你可以选择使用数组来实现,也可以选择使用链表来实现。

 

入队

  现在我们要在队列中添加一个数据100。

出队

  现在我们从队列中取出一个数据。

  队尾的25这个数据就出队了。

 

效率

  队列的效率并不固定,它取决于队列的具体实现方式,比如用数组实现一个简单队列,入队只需要在队头添加一个元素即可,复杂度为O(1),而出队需要把队中的每个数据往前移动一格,占据出队数据让出的空间,复杂度为O(n)。

 

循环队列实现

最近写了一个循环队列的java实现,仅供参考:

/**
 * @Description
 * @Author zhaobaolin
 * @Date 2019/5/24
 *
 * 循环队列实现
 * MyCircularQueue(k): 构造器,设置队列长度为 k 。
 * Front: 从队首获取元素。如果队列为空,返回 -1 。
 * Rear: 获取队尾元素。如果队列为空,返回 -1 。
 * enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
 * deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
 * isEmpty(): 检查循环队列是否为空。
 * isFull(): 检查循环队列是否已满。
 */
public class MyCircularQueue {

    private int[] arr;
    private int k;//队列长度
    private int head = -1;//队首
    private int tail = -1;//队尾

    public MyCircularQueue(int k)
    {
        this.k = k;
        this.arr = new int[this.k];
    }

    public int Front()
    {
        if(isEmpty()){
            return -1;
        }
        int v = this.arr[head];
        return v;
    }

    public int Rear()
    {
        if(isEmpty()){
            return -1;
        }
        int v = this.arr[tail];
        return v;
    }

    public boolean enQueue(int value)
    {
        if(isFull()){
            return false;
        }
        if(isEmpty()){
            this.head++;
        }

        this.tail = (tail + 1) % k;
        this.arr[this.tail] = value;
        return true;
    }

    public boolean deQueue()
    {
        if(isEmpty()){
            return false;
        }
        this.head ++;
        if(this.head == this.tail + 1){
            this.head = -1;
            this.tail = -1;
        }
        return true;
    }

    public boolean isEmpty()
    {
        return this.head == -1;
    }

    public boolean isFull()
    {
        return ((tail + 1) % this.k) == head;
    }
}

 

附上测试用例:

    public static void main(String[] args) {

        System.out.println("第1行开始-----------------------------------------");
        MyCircularQueue queue = new MyCircularQueue(30);
        System.out.println(queue.enQueue(71));
        System.out.println("队列是否是满的:"+queue.isFull());
        System.out.println(queue.enQueue(32));
        System.out.println(queue.enQueue(1));
        System.out.println("队列是否是满的:"+queue.isFull());
        System.out.println(queue.enQueue(32));
        System.out.println(queue.enQueue(8));
        System.out.println(queue.enQueue(6));
        System.out.println(queue.Front());

        System.out.println("第2行开始-----------------------------------------");
        System.out.println(queue.Front());
        System.out.println(queue.Rear());
        System.out.println(queue.enQueue(8));
        System.out.println(queue.Rear());
        System.out.println(queue.enQueue(3));
        System.out.println(queue.Rear());
        System.out.println(queue.Front());
        System.out.println(queue.enQueue(56));
        System.out.println(queue.enQueue(41));
        System.out.println(queue.Front());

        System.out.println("第3行开始-----------------------------------------");
        System.out.println(queue.enQueue(14));
        System.out.println(queue.enQueue(6));
        System.out.println(queue.Rear());
        System.out.println(queue.enQueue(25));
        System.out.println(queue.isEmpty());
        System.out.println(queue.Rear());
        System.out.println(queue.Front());
        System.out.println(queue.Rear());
        System.out.println(queue.enQueue(44));
        System.out.println(queue.Front());

        System.out.println("第4行开始-----------------------------------------");
        System.out.println(queue.enQueue(84));
        System.out.println(queue.Rear());
        System.out.println(queue.isEmpty());
        System.out.println(queue.Rear());
        System.out.println(queue.enQueue(59));
        System.out.println(queue.Front());
        System.out.println(queue.Front());
        System.out.println(queue.deQueue());
        System.out.println(queue.enQueue(4));
        System.out.println(queue.Front());

        System.out.println("第5行开始-----------------------------------------");
        System.out.println(queue.enQueue(40));
        System.out.println(queue.enQueue(11));
        System.out.println(queue.deQueue());
        System.out.println(queue.enQueue(94));
        System.out.println(queue.isFull());
        System.out.println(queue.Front());
        System.out.println(queue.enQueue(72));
        System.out.println(queue.deQueue());
        System.out.println(queue.enQueue(19));
        System.out.println(queue.isEmpty());

        System.out.println("第6行开始-----------------------------------------");
        System.out.println(queue.isEmpty());
        System.out.println(queue.enQueue(20));
        System.out.println(queue.Front());
        System.out.println(queue.Front());
        System.out.println(queue.Rear());
        System.out.println(queue.deQueue());
        System.out.println(queue.Front());
        System.out.println(queue.enQueue(58));
        System.out.println(queue.Rear());
        System.out.println(queue.enQueue(54));

        System.out.println("第7行开始-----------------------------------------");
        System.out.println(queue.Rear());
        System.out.println(queue.Rear());
        System.out.println(queue.Front());
        System.out.println(queue.deQueue());
        System.out.println(queue.enQueue(65));
        System.out.println(queue.deQueue());
        System.out.println(queue.Rear());
        System.out.println(queue.enQueue(95));
        System.out.println(queue.Front());
        System.out.println(queue.enQueue(26));

        System.out.println("第8行开始-----------------------------------------");
        System.out.println(queue.enQueue(10));
        System.out.println(queue.deQueue());
        System.out.println(queue.enQueue(14));
        System.out.println(queue.Front());
        System.out.println(queue.enQueue(2));
        System.out.println(queue.deQueue());
        System.out.println(queue.enQueue(37));
        System.out.println(queue.Front());
        System.out.println(queue.Front());
        System.out.println(queue.enQueue(46));

        /**
         测试结果
         true,false,true,true,false,true,true,true,71,
         71,6,true,8,true,3,71,true,true,71,
         true,true,6,true,false,25,71,25,true,71,
         true,84,false,84,true,71,71,true,true,32,
         true,true,true,true,false,1,true,true,true,false,
         false,true,32,32,20,true,8,true,58,true,
         54,54,8,true,true,true,65,true,8,true,
         true,true,true,3,true,true,true,56,56,true,
         */
    }

 

posted @ 2019-05-15 11:57  不该相遇在秋天  阅读(334)  评论(0编辑  收藏  举报