Java实现数据结构--队列

队列介绍

  • 队列时一个有序列表,可以用数组或者链表来实现。
  • 遵循先进先出的原则。即:先存入队列的数据,要先取出。后存入的数据,后取出。
  • 示意图:(使用数组模拟队列的示意图)

在这里插入图片描述

数组模拟队列

  • 队列本身时有序列表,若使用数组的结构来存储队列的数据,则队列数据的声明如上如,其中maxSize是该队列的最大容量
  • 因为队列的输入、输出分别从前后端来处理,因此声明两个变量front和rear分别记录队列的前后端的下标,front会随着数据输出而改变,rear会随着数据输入而改变(如上图)

代码思路分析

  • front指向第一个元素
  • rear指向最后一个元素的后一个空间
  • 当队列满时,(rear+1)%maxSize=front
  • 当队列为空时,rear = front
  • 队列中有效数据的个数:(rear+maxSize-front)%mazSize
  • 【注意思考:为什么要留一个空位?】
  • 因为要防止【队列空】和【队列满】条件相同
int maxSize;
int front;//队头
int rear;//队尾
int[] arr;

//创建队列构造器(代码略过)

//判断队列是否满(代码略过)rear = maxSize-1;

//判断对略是否为空(代码略过)

//添加数据到队列(代码略过)

//获取队列的数据(代码略过)
//isEmpty() throw new RuntimeException("队列空")

//显示队列所有数据

//显示队列的头数据

代码实现队列

public class MyQueue {

    private int maxSize;
    private int front;
    private int rear;
    private int[] arr;
    public MyQueue() {
    }

    public MyQueue(int maxSize) {
        this.maxSize = maxSize+1;
        this.arr = new int[maxSize+1];
        this.front = 0;
        this.rear = 0;
    }

    private boolean isFull(){
        if((rear+1)%maxSize==front){
            return true;
        }else {
            return false;
        }
    }

    private boolean isEmpty(){
        if(this.rear==this.front){
            return true;
        }else {
            return false;
        }
    }

    private void offer(int data){
        if(!isFull()){
            arr[rear]=data;
            rear = (rear+1)%maxSize;
        }else {
            System.out.println("队列已满");
        }
    }

    private int poll(){
        if(!isEmpty()){
            int value = arr[front];
            front = (front+1)%maxSize;
            return value;
        }else {
            throw new RuntimeException("队列为空");
        }
    }

    private void showQueue(){
        int size = size();
        for(int i=front;i<front+size;i++){
            System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
        }
    }

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

    public static void main(String[] args) {
        MyQueue queue = new MyQueue(5);
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        queue.offer(5);
        queue.offer(6);
        queue.poll();
        queue.offer(6);
        queue.showQueue();
        queue.poll();
        queue.poll();
        queue.poll();
        queue.poll();
        queue.poll();
        queue.poll();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值