java实现队列和循环队列

这个问题以前没有注意,现在觉得很有趣。

1 普通队列,在数据里面加一个size来判断数据总量的大小,再根据大小判断

是否空和满,empty和full我未写到方法里面。每次都需要额外对size进行操

作,高性能场景还是有部分性能损失。

front指向可用的元素,rear指向下一个可用的元素。

class QueueS{

    private int max;
    private long[] queArr;

    private int front;
    private int rear;
    private int size;

    /**
     * 多一行数据,区分空和满
     * 
     * @param s
     */
    public QueueS(int s){
        // 声明100。就可以存储到101
        max = s;
        size = 0;
        queArr = new long[max];
        front = 0;
        rear = -1;
    }

    //插入
    public void insert(long j){
        if(rear == max -1){//最后一个元素
            rear = -1;
        }
        queArr[++rear] = j;
        size++;
    }

    //移除
    public long remove(){
        long temp = queArr[front++];
        if(front == max){
            front = 0;
        }
        size--;
        return temp;
    }

    public long peek(){
        return queArr[front];
    }

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

    public boolean isFull(){
        return size == max;
    }

    public int size(){
        return size;
    }

}

2 循环队列。

指定了数组大小为size。如果存储size的空间,可能出现无法判断数组到底是

空还是满的情况。因为空满,都是front == rear

我们可以把rear这个空间空出来。

如果不空出来的话:front =1 rear = 1. 可以判断为满或者空

如果空出rear front =1 rear =1 是空。
front = 1 rear = 0 是满。

队列的长度。如果rear > front 直接减去
如果 rear < front 。rear肯定是走过一圈了。(rear+max -front)%max 即可

class Queue{

    private int max;
    private long[] queArr;

    private int front;
    private int rear;

    /**
     * 多一条数据,实际存储数据为s
     * 
     * @param s
     */
    public Queue(int s){
        max = s + 1;
        queArr = new long[max];
        front = 0;
        rear = 0;
    }

    //尾部插入,插入
    public boolean insert(long j){
        //如果已经满了,不允许插入
        if(isFull()) {
            System.out.println("queue is full");
            return false;
        }

        queArr[rear] = j;
        rear = (rear+1)%max;
        return true;
    }

    //移除, front 始终是非负数
    public long remove(){
        long temp = queArr[front];
        front = (front+1)%max;
        return temp;
    }

    public long peek(){
        return queArr[front];
    }

    //相等即为空,因为满了不再让放入数据
    public boolean isEmpty(){
        return rear == front;
    }

    //
    public boolean isFull(){
        return (rear+1)%max == front;
    }

    public int size(){
        return (rear-front+max)%max;
    }

}

猜你喜欢

转载自blog.csdn.net/cabing2005/article/details/79619548