0
点赞
收藏
分享

微信扫一扫

环形队列(数组)的设计

豆丁趣 2022-01-23 阅读 89

环形队列,无非就是头和尾是连接起来的,避免资源的浪费,可以循环使用数组空间进行数据存储。

头指针head:指向当前第一个元素的位置称为头指针。

尾指针tail:指向当前最后一个元素的下一个位置为尾指针。

当前元素的数量 = (tail - head + size) % size

初始状态(空):head == tail

满:(tail+1)%size == head

初始状态图

满状态图(此时7位置是空的)

 

代码实现

public class CircleArray{
    // 容量
    private int size;
    // 头指针
    private int head;
    // 尾指针
    private int tail;
    // 数组
    private int[] array;
    
    // 初始构造
    public CircleArray(int size){
        if (size <= 0){
            throw new InvalidArgumentException("invalid size");
        }
        this.size = size;
        array = new int[size];
    }

    // 队满判定
    public boolean isFull(){
        return (tail + 1) % size == head;
    }

    // 队空判定
    public boolean isEmpty(){
        return head == tail;
    }

    // 追加元素到队尾
    public boolean enqueue(int entry){
        if(isFull()){
            return false;
        }
        array[tail] = entry;
        tail = (tail + 1) % size;
        return true;
    }

    // 出队
    public Integer dequeue(){
        if(isEmpty()){
            return null;
        }
        int val = array[head];
        head = (head + 1) % size;
        return val;
    }

    // 打印队列
    public void show(){
        if(isEmpty()){
            return;
        }
        for(int i= head; i< head + size(); i++){
            System.out.printf("array[%d]=%d\n", i % size, array[i % size]);
        }
    }
    
    // 元素个数
    public int size(){
        return (tail - head + size) % size;
    }

    // 查看队首元素
    public Integer peek(){
        if (isEmpty()){
            return null;
        }
        return array[head];
    }
}
举报

相关推荐

0 条评论