数组模拟队列/环形队列

队列:可以用数组链表来实现,遵循先入先出的原则。

数组模拟队列:队列的输入和输出分别从前后端来处理,需要两个变量:front和rear分别记录前后端的下标,front随输出而变化,rear随输入而变化。

       1,尾指针后移:rear+1;

       2,置空:front;

       3,队列满:rear=MaxSize-1;

代码实现:

class ArrayQueue {
    //声明私有变量,头部,尾部,最大容量,存放数据数组
    private int front;
    private int rear;
    private int MaxSize;
    private int[] Arr;

    //创建队列的构造器
    public ArrayQueue(int arrMaxSize) {
        MaxSize = arrMaxSize;
        Arr = new int[MaxSize];
        front = -1;
        rear = -1;
    }

    //判断队列是否满 rear=MaxSize-1
    public boolean isFull() {
        return rear == MaxSize - 1;
    }

    //判断是否为空rear==front
    public boolean isEmpty() {
        return rear == front;
    }

    //添加数据到队列 满则提升无法加入
    public void addQueue(int n) {
        if (isFull()) {
            System.out.println("满");
            return;
        }
        rear++;
        Arr[rear] = n;
    }

    //获取队列的数据,出队列(判空,头指针后移,返回值)
    public int getQueue() {
        if (isEmpty()) {
            System.out.println("空");
            throw new RuntimeException("空");
        }
        front++;
        return Arr[front];
    }

    //展示所有数据(判空,遍历)
    public void showQueue() {
        if (isEmpty()) {
            System.out.println("空");
            return;
        }
        for (int i = 0; i < Arr.length; i++) {
            System.out.println("Arr[" + i + "]= " + Arr[i]);
        }
    }

    //显示头数据
    public int showFront() {
        if (isEmpty()) {
            System.out.println("空");
            throw new RuntimeException("空");
        }
        return Arr[front + 1];
    }

}

数组模拟环形队列:
        1,front指向队列的第一个元素;初始值为0
        2,rear指向队列最后一个元素的后一个位置,初始值为0
        3,队列满时,(rear+1)%Maxsize=front
        4,队列空的条件,rear==front
 有效数据个数(rear+MaxSize-front)%MaxSize

代码实现:

public class CircularQueue {
    private int front;
    private int rear;
    private int Maxsize;
    private int[] arr;
    //创建环形数组
    public int[] createCQ(int MaxSize){
        front=0;
        rear=0;
        Maxsize=MaxSize;
        arr=new int[Maxsize];
        return arr;
    }
    //判断环形数组满
    public boolean isFull(){
        return (rear+1)%Maxsize==front;
    }
    //判断环形数组空
    public boolean isEmpty(){
        return rear==front;
    }
    //元素出环
    public int getValue() {
        if (isEmpty()) {
            throw new RuntimeException("环形队列为空");
        }
        int value=arr[front];
        front=(front+1)%Maxsize;
        return value;
    }
    //添加元素
    public void addValue(int val){
        if(isFull()){
            throw  new RuntimeException("队列满,无法添加");
        }
        arr[rear]=val;
        rear=(rear+1)%Maxsize;
        System.out.println("添加元素成功");
    }
    //元素展示
    public void show(){
        if(isEmpty()){
            throw new RuntimeException("环形队列为空");
        }
        for (int i = front; i <front+(rear+Maxsize-front)%Maxsize; i++) {
            System.out.println(arr[i%Maxsize]);
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值