数组模拟队列

数组模拟队列

方式一:普通队列

这种方式数组只是使用一次

private int front;//模拟头指针
private int rear;//模拟尾指针
private int Maxsize;//模拟队列最大容量
private int[] array;//模拟队列存放数据

    //构造方法初始化数组
    public ArrayQueueDemo(int maxsize) {
        this.front = -1;//指向队列头元素的前一个
        this.rear = -1; //指向队列的最后一个元素
        Maxsize = maxsize;
        this.array = new int[Maxsize];
    }

栈满的条件:front == rear 栈空的条件:rear == Maxsize - 1;

入队:

public void addQueue(int n) {
    if (isFull()) {
        System.out.println("队列已满");
        return;
    }
    rear++;//尾指针后移
    array[rear] = n;//把元素放进数组
}

出队:

public int getQueue() {
    if (isEmpty()) {
        throw new RuntimeException("队列为空!!");
    }
    front++;//后移一位
    return array[front];//取出数据
}

方式二(改进):环形

此种方式改变front和rear的定义来实现环形队列,但是必须牺牲一个空间. 也就是说一开始设立的数组永远不能装满

栈满的条件:(rear+1)%Maxsize == front 栈空的条件:front == rear

出队:

/*出队列*/
public int getQueue() {
    if (isEmpty()) {
        throw new RuntimeException("队列为空!!");
    }
    int value = array[front];
    front = (front+1)%Maxsize;//取模后 每次取到队列最后一个时,便会从0开始取
    return value;//取出数据
}

入队:

/*向队列添加元素(入队列)*/
public void addQueue(int n) {
    if (isFull()) {
        System.out.println("队列已满");
        return;
    }
    array[rear] = n;//把元素放进数组
    System.out.println("rear="+rear+"n:"+n);
    rear = (rear+1)%Maxsize;//取模后 每次队列满的时候,取出后,下次再存便是从0开始
}

完整队列类代码

class Circlequeue{
    private int front;//指向队列第一个元素
    private int rear;//指向队列最后一个有效元素的后一个位置(始终是空的)
    private int Maxsize;//模拟队列最大容量
    private int[] array;//模拟队列存放数据

    //初始化
    public Circlequeue(int maxsize) {
        this.front = 0;//不写也可以  默认为零
        this.rear = 0; //
        Maxsize = maxsize;
        array = new int[Maxsize];
    }
    /*判断队列是否为空*/
    public boolean isEmpty() {
        return front == rear;
    }

    /*判断队列是否满*/
    public boolean isFull() {
        return (rear+1)%Maxsize == front;
    }

    /*向队列添加元素(入队列)*/
    public void addQueue(int n) {
        if (isFull()) {
            System.out.println("队列已满");
            return;
        }
        array[rear] = n;//把元素放进数组
        System.out.println("rear="+rear+"n:"+n);
        rear = (rear+1)%Maxsize;//取模后 每次队列满的时候,取出后,下次再存便是从0开始
    }

    /*出队列*/
    public int getQueue() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空!!");
        }
        int value = array[front];
        front = (front+1)%Maxsize;//取模后 每次取到队列最后一个时,便会从0开始取
        return value;//取出数据
    }

    /*打印当前队列里的信息*/
    public void getall() {
        if (isEmpty()) {
            System.out.println("队列为空");
        }
        for (int i = front; i <front+getsize(); i++) {
            //当队列一个元素在array[maxsize-1],一个在array[0]时,front=maxsize-1,getsize=2;
            //所以i是可能等于maxsize 甚至maxsize+1 所以要 i%Maxsize
            System.out.println("队列里的元素为:array["+i%Maxsize+"]"+array[i%Maxsize]);
        }
    }
    /*求有效数据个数*/
    public int getsize(){
        //当存了maxsize-1次(此时已经不能再存了 因为一个预留空间)时,取一个(取出一个后又可以存),再存一个(这时有数据的是1到maxsize)
        // 也就是说maxsize可以存数据 但必须是0号为空的前提下(最多只可以放maxsize-1个数据 这些数据可以再数组的任意连续maxsize-1个位置)
        // 这时rear<front 所以要加maxsize
        return (rear+Maxsize-front)%Maxsize;
    }
    /*求数据头*/
    public int gethead(){
        if (isEmpty()) {
            System.out.println("队列为空");
        }
        return array[front];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值