数据结构2.0—队列


前言

队列是一个有序列表,可以用数组或者链表来实现。遵循先入先出原则,即先存入队列的数据,要先取出,后存入的数据后取出。


一、数组实现队列

队列本身是有序列表,如果使用数组的结构来存储队列的数据,那么队列数组要有maxSize(该队列最大容量),队列的输出、输入是分别从前后端来处理的,因此需要两个变量front以及rear分别记录队列前后端的下标,front会随着数据的输出而改变,rear是随着数据输入而改变。

示意图:
在这里插入图片描述

二、数组模拟队列代码示例

定义一个自定义表示队列的类

package com.darkForest.queue;

import lombok.extern.slf4j.Slf4j;

/*
* 数组模拟队列,遵循先入先出原则
* */
@Slf4j(topic = "e")
public class MyQueue {
    //队列数组
    private int[] queueArray;
    //最大容量
    private int maxSize;
    //实际长度
    private int length;
    //指向队列尾
    private  int rear;
    //指向队列头的前一个位置
    private int front;
    //构造方法
    public MyQueue(int maxSize){
        this.maxSize=maxSize;
        queueArray=new int[this.maxSize];
        rear=-1;
        front=-1;
    }
    //判断是否为空
    public boolean isEmpty(){
        if (front==rear){
            return true;
        }
        return false;
    }
    //判断队列是否已满
    public boolean isFull(){
        if (front==maxSize-1){
            return true;
        }
        return false;
    }
    //添加方法
    public void add(int data){
        //先判断队列是否已满
        if (isFull()){
           throw  new RuntimeException("队列已满");
        }
        front++;
        queueArray[front]=data;
        length++;
    }
    //取队列数据
    public int get(){
        //先判断队列为空
        if (isEmpty()){
            throw new RuntimeException("队列为空");
        }
        rear++;
        return queueArray[rear];
    }
    //取全部队列数据
    public int[] getAll(){
        //判断队列是否为空
        if (isEmpty()){
            throw new RuntimeException("队列为空");
        }
        int size=MyQueue.this.length;
        int[] takeQueue=new int[size];
        for (int i = rear, temp=0; i <=front ; i++,temp++) {
            takeQueue[temp]=queueArray[i];
        }
        return takeQueue;
    }
}


来测试一下

package com.darkForest.queue;

import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "e")
public class Test {
    public static void main(String[] args) {
        MyQueue myQueue=new MyQueue(5);
        myQueue.add(12);
        myQueue.add(34);
        myQueue.add(21);
        int i = myQueue.get();
        log.debug("head is {}",i);
        int[] all = myQueue.getAll();
        for (int j = 0; j < all.length; j++) {
            log.debug("queue:{}",all[j]);
        }
    }
}

测试结果1
在这里插入图片描述

异常测试

package com.darkForest.queue;

import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "e")
public class Test {
    public static void main(String[] args) {
        MyQueue myQueue=new MyQueue(5);
        int i = myQueue.get();
        log.debug("head is {}",i);
        int[] all = myQueue.getAll();
        for (int j = 0; j < all.length; j++) {
            log.debug("queue:{}",all[j]);
        }
    }
}

测试结果2
在这里插入图片描述

package com.darkForest.queue;

import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "e")
public class Test {
    public static void main(String[] args) {
        MyQueue myQueue=new MyQueue(5);
        myQueue.add(1);
        myQueue.add(2);
        myQueue.add(3);
        myQueue.add(4);
        myQueue.add(5);
        myQueue.add(6);

    }
}

测试结果3
在这里插入图片描述

总结

队列在许多地方有着相当重要的应用,如多线程中的synchronized等锁要使线程等待,线程就会被放在waitSet中,waitSet就是一个队列。唤醒之后阻塞的线程放在entryList中,entryList也是一个队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值