[数据结构]P1.2 队列

* 注: 本文/本系列谢绝转载,如有转载,本人有权利追究相应责任。 2019年4月8日

Stan Zhang 2019年4月8日  格物致知,经世致用。

 

队列是一种先进先出FIFO的模型,常见操作有: push、pull 获得队列出口首元素并从队列中删除、peek 查看队列出口首元素,不从队列中删除。

队列与其他线性结构一样,可以使用数组或者链表实现,这里使用数组实现。

 

使用数组实现队列长度必然是固定的,因此规定当队列存满之后不再进行扩容,只是提示。

 

队列中为了充分使用数据空间,首尾指针采用与数组长度求模的方式进行添加和删除。

 

Java代码:

package ds2.queue;

public class ArrayQueue {
    static class Queue{
        int maxSize;
        int queSize;
        long[] data ;
        int head; // 头索引
        int tail; // 尾索引
        public Queue(int maxSize) {
            this.maxSize = maxSize;
            this.data = new long[maxSize];
            this.head = 0;
            this.tail = -1;
        }

        public boolean isFull(){
            return maxSize == queSize;
        }

        public boolean isEmpty(){
            return queSize == 0;
        }


        /**
         * 向尾部加数据
         * 线性时间
         * @param data
         */
        public void push(long data){
            if(isFull()){
                System.out.println("The element cann't be inserted owing to the queue is full!");
            }else{
                this.tail = (this.tail + 1)%this.data.length;
                this.data[this.tail] = data;
                this.queSize ++ ;
            }
        }

        /**
         * 从头部取数据,线性时间
         * @return
         */
        public long peek(){
            return this.data[this.head];
        }

        /**
         * 从头部取数据
         * @return
         */
        public long pull(){
            long data = this.data[this.head];
            this.head = (this.head + 1)%this.data.length;
            this.queSize --;
            return data;
        }

        public void foreachPrint(){
            if(this.isEmpty()){
                System.out.println("[]");
                return;
            }
            System.out.print("[" + this.data[this.head]);
            for(int i = 1,j = this.head + 1; i < queSize; i++,j++){
                System.out.print("," + this.data[j%this.data.length]);
            }
            System.out.println("]");
        }

    }

    public static void main(String[] args) {
        Queue queue = new Queue(4);
        queue.push(1);
        queue.foreachPrint();
        queue.push(2);
        queue.foreachPrint();
        queue.push(3);
        queue.foreachPrint();
        queue.push(4);
        queue.foreachPrint();
        queue.push(5);
        queue.foreachPrint();
        System.out.println(queue.peek());
        queue.foreachPrint();
        System.out.println(queue.pull());
        queue.foreachPrint();
        System.out.println(queue.pull());
        queue.foreachPrint();
        queue.push(5);
        queue.foreachPrint();
        queue.push(6);
        queue.foreachPrint();
    }
}

result::

[1]
[1,2]
[1,2,3]
[1,2,3,4]
The element cann't be inserted owing to the queue is full!
[1,2,3,4]
1
[1,2,3,4]
1
[2,3,4]
2
[3,4]
[3,4,5]
[3,4,5,6]

 

posted @ 2019-04-18 11:32  yosql473  阅读(175)  评论(0编辑  收藏  举报