ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

简单数组与环形数组来实现队列

2021-01-05 17:01:23  阅读:130  来源: 互联网

标签:arr 队列 环形 int maxSize 数组 front public rear


队列:

在这里插入图片描述
在这里插入图片描述
数组队列(一次性存取,因为指针上移之后就没有下移过了):

class  ArrayQueue{
    private int maxSize;
    private int front;
    private int rear;
    private int[] arr;

    public ArrayQueue(int arrMaxSize){
        maxSize=arrMaxSize;
        front=-1;
        rear=-1;
        arr=new int[maxSize];
    }

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

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

    public void addQueue(int n){
        if (isFull()){
            System.out.println("很遗憾,队列已满~");
        }
        rear++;
        arr[rear]=n;
    }

    public int  getQueue(){
        if (isEmpty()){
            throw new RuntimeException("没有数据可以取出~");
        }else {
            front++;
            return arr[front];
        }
    }

   public void showQueue(){
        if (isEmpty()){
            System.out.println("队列为空~");
        }else {
            for (int i=0;i<arr.length;i++) {
                System.out.printf("arr[%d]\t%d\n",i,arr[i]);
            }
        }
   }

   public int getFront(){
        if (isEmpty()){
            throw new RuntimeException("没有数据可以取出~");
        }else {
            return arr[front+1];
        }
   }

存在问题:数组只有一次性就不能复用了
环形数组队列:
在这里插入图片描述在这里插入图片描述

class  CircleArray {
    private int maxSize;
    private int front;
    private int rear;
    private int[] arr;

    public CircleArray(int arrMaxSize) {
        maxSize = arrMaxSize;
        front = 0;
        rear = 0;
        arr = new int[maxSize];
    }

    public boolean isFull() { 
        return (rear + 1) % maxSize == front;//取模是因为防止负数,就相当于取绝对值的意思
    }

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

    public void addQueue(int n) {
        if (isFull()) {
            System.out.println("很遗憾,队列已满~");
        }
        arr[rear] = n;
        rear = (rear + 1) % maxSize;
    }

    public int getQueue() {
        if (isEmpty()) {
            throw new RuntimeException("没有数据可以取出~");
        } else {
            int value=arr[front];
            front=(front+1)%maxSize;
            return value;
        }
    }

    public void showQueue() {
        if (isEmpty()) {
            System.out.println("队列为空~");
        } else {
            for (int i = front; i < front+size(); i++) {
                System.out.printf("arr[%d]\t%d\n", i%maxSize, arr[i%maxSize]);
            }
        }
    }

    public int getFront() {
        if (isEmpty()) {
            throw new RuntimeException("没有数据可以取出~");
        } else {
            return arr[front];
        }
    }

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

maxsize是总的数组长度,但是实际上存放的数据是maxsize-1,要留一个位置来实现取模循环,比如maxsize=4,只能存三个数,到第三个数存放完毕的时候,rear=3,front=0,此时队列已满,然后出列一个数front=1;此时队列不满,然后插入一个数据rear就等于0了,此时队列又满了,就是通过 4运算来实现的循环。(可以画一个简单的草图易于理解)

标签:arr,队列,环形,int,maxSize,数组,front,public,rear
来源: https://blog.csdn.net/weixin_46558851/article/details/112244081

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有