数组实现队列以及循环队列

队列是一种基本的数据结构具有FIFO的特性(先进先出),下面是数组实现队列

一.静态数组实现队列

实现队列中需要定义的变量,头指针front,数组的大小maxsize,数组array,尾指针rear

在java中的定义如下

public class ArrayQueen {
    //数组最大长度
    private int maxsize;
    //队列头指针
    private int front;
    //队列尾指针
    private int rear;
    //数组实现队列
    private int[] arr;
}

初始化时,头指针和尾指针相等,即 front = rear = -1,在java中可以在类的构造方法中完成变量的初始化。

//用构造方法实现队列的初始化
    public ArrayQueen(int maxsize){
        this.maxsize = maxsize;
        front = -1 ;
        rear = -1 ;
        this.arr = new int[maxsize];
    }

接下来,为了方便操作可以让头指针指向第一个元素的前一个位置,尾指针指向最后一个元素

判断队列为空的条件是:尾指针等于头指针即rear = = front

判断队列为满的条件是:尾指针指向数组最大长度减一,即rear == maxsize - 1(这里的数组是从下标为零开始的)

增加元素时:尾指针后移一位,再将数值赋给尾指针指向的位置,即arr[++rear] = 数值

删除元素时:头指针后移一位,再返回头指针指向的元素,即 return arr[++front];

ps:我这里的操作都是基于头指针指向第一个元素的前一个位置,尾指针指向最后一个元素的情况

在java中的实现如下

//判断队列是否为满
    public boolean isFull(){
        if (rear == (maxsize - 1)){
            return true;
        }
        return false;
    }
    //判断队列是否为空
    public boolean isEmpty(){
        if (rear == front){
            return true;
        }
        return  false;
    }
    //先判断队列是否为满,再添加元素
    public void add(int num){
        if (isFull()){
          System.out.println("队列为满,不可添加");
          return;
        }
        arr[++rear] = num ;
    }
    //先判断队列是否为空,在进行取数字
    public int getNum(){
        if (isEmpty()){
            throw new RuntimeException("队列为空,不可取数字");
        }
        return arr[++front];
    }
    //取头部数字
    public void queryHead(){
        if (isEmpty()){
            throw new RuntimeException("队列为空,不可取数字");
        }
        System.out.println("头部的数字为:" + arr[++front]);
    }
    //查询队列中的元素
    public void query(){
        System.out.print("队列中的元素有:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print("\t" + arr[i]);
        }
    }

二.静态数组实现循环队列

由于静态数组的局限性,无法对数组的空间完美利用,所以就出现了循环队列,实现循环队列的方法很多,我这里写的是牺牲数组中的一个存储空间实现循环队列的方法

循环队列同样是用静态数组实现的,只不过在其中加入了取余操作,使其成为了一个环状,在其中同样需要定义数组,数组的最大长度,头指针和尾指针,只不过初始化时头指针与尾指针都指向了数组0的位置,即 rear = front = 0;

接下来的操作都是基于头指针指向数组的第一个元素位置,而尾指针指向数组的最后一个元素的后一个位置,并在数组中空出一个位置且这个位置不可添加元素,如图所示

 队列中的元素个数:(rear + maxsize - front)% maxsize

判断队列为满:(rear + 1)% maxsize == front

判断队列为空: rear == front

增加元素:将需要添加的数值赋给rear指针所指的位置,然后(rear+1)即,arr[rear] = 数值;

                                                                                                                           rear++;

 删除元素:将front指针所指的元素赋值给一个变量,然后(front+1),之后在返回这个变量

               即:  num = rear[front];

                        front++;

                       return num;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值