队列 & 环形队列

队列

队列是有序列列表(数组或链表),遵循先入先出的原则

基础队列

头指针front:首元素的前一个位置。初始值-1
尾指针rear:尾元素的位置。初始值-1

存数据时rear动,取数据时front

缺点:该队列只能按顺序存取一次,指针位置不会循环变化,不能复用

环形队列

首尾相连
1.front:指向队列的第一个元素,即arr[front]就是队列的第一个元素。初始值0
2.rear:指向队列末尾元素后一个位置,空出一个空间做为约定。初始值0
3.当队列满的条件:(rear + 1) % maxSize = front
4.对队列为空的条件:rear == front
5.当我们这样分析,队列中有效的数据的个数(rear + maxSize - front) % maxSize

代码 --> 队列

//使用数组模拟队列编写一个ArrayQueue类
public class ArrayQueue01 {
    private int maxSize;
    private int front;
    private int rear;
    private int[] arr;

    //构造方法
    public ArrayQueue01(int maxSize) {
        this.maxSize = maxSize;
        front = -1;//头指针,首元素的前一个位置
        rear = -1;//尾指针,末尾元素的位置
        arr = new int[maxSize];
    }

    public boolean isEmpty() {
        return rear == front;
    }

    public boolean isFull() {
        return rear == maxSize - 1;
    }

    public void addQueue(int data) {
        if(isFull()) {
            throw new RuntimeException("队列已满");
        }
        rear ++;//尾指针后移
        arr[rear] = data;
    }

    public int getQueue() {
        if(isEmpty()) {
            throw new RuntimeException("队列为空");
        }
        front ++;
        return arr[front];
    }

    public void show() {
        if(isEmpty()) {
            throw new RuntimeException("队列为空");
        }
        for(int i = 0; i < arr.length; i ++) {
            System.out.printf("arr[%d] = %d\n",i,arr[i]);
        }
    }

    public int headQueue() {
        if(isEmpty()) {
            throw new RuntimeException("队列为空");
        }
        return arr[front + 1];
    }
}

代码 --> 环形队列

public class CircleArrayQueue {
    private int front = 0;
    private int rear = 0;
    private int maxSize;
    private int[] arr;

    public CircleArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        arr = new int[maxSize];
    }

    public boolean isEmpty() {
        return rear == front;
    }

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

    public void addValue(int value) {
        if(isFull()) {
            throw new RuntimeException("环形队列已满");
        }
        arr[rear] = value;
        rear = (rear + 1) % maxSize;//环形队列首尾相连,取模是为了防止数组越界
    }

    public int getValue() {
        if(isEmpty()) {
            throw new RuntimeException("环形队列为空");
        }
        int value = arr[front];
        front = (front + 1) % maxSize;//防止数组越界
        return value;
    }

    public void showArr() {
        if(isEmpty()) {
            System.out.println("环形队列为空");
        }
        int num = (rear - front + maxSize) % maxSize;
        for(int i = front; i < front + num; i ++) {
            System.out.print(arr[i % maxSize] + "\t");
        }
        System.out.println();
        System.out.println("头指针:" + front + "\t尾指针:" + rear);
    }

    public void headValue() {
        if(isEmpty()) {
            System.out.println("环形队列为空");
        }
        System.out.println("头指针为" + front + "\t值为" + arr[front]);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值