数据结构5:队列

队列简介

队列 是 先进先出( FIFO,First In, First Out) 的线性表。在具体应用中通常用链表或者数组来实现,用数组实现的队列叫作 顺序队列 ,用链表实现的队列叫作 链式队列 。队列只允许在后端(rear)进行插入操作也就是 入队 enqueue,在前端(front)进行删除操作也就是出队 dequeue

常见队列:单队列、循环队列

假设队列中有n个元素。
访问:O(n)//最坏情况
插入删除:O(1)//后端插入前端删除元素

单队列

单队列就是常见的队列, 每次添加元素时,都是添加到队尾。单队列又分为 顺序队列(数组实现) 和 链式队列(链表实现)。

顺序队列存在“假溢出”的问题也就是明明有位置却不能添加的情况。即队尾指针已经指向末尾,但仍旧有空余位置。

public class MyQueue {

    private int maxSize ; //最大容量
    private int front;  //队列的头部
    private int rear ;  //队列的尾部
    private int arr[];  //存数据的数组
    //创建队列的构造器
    public MyQueue(int arrmaxSize){
        maxSize = arrmaxSize;
        arr = new int[maxSize];
        front = -1 ;
        rear = -1 ;
    }
    //判断队列是否是满的
    public boolean isFull(){
        return rear == maxSize-1 ;
    }
    //判断队列是否为空
    public boolean isEmpty(){
        return rear == front ;
    }
    //相队列里面添加数据
    public void add(int num){
        if (isFull()){
            System.out.println("队列已经满了,不能加入数据!");
        }else {
            rear++;
            arr[rear] = num;
            //arr[++rear] = num ;
        }
    }
    //出队列
    public int poll(){
        if (isEmpty()){
            throw new RuntimeException("对列为空,没有数据!");//throw完了会返回
        }else{
            front++;
            return arr[front];
        }
    }

    //显示队列的头部,不是取出数据
    public int peek(){
        if (isEmpty()){
            throw new RuntimeException("对列为空,没有数据!");
        }else {
            return arr[front+1];
        }
    }
}

循环队列

循环队列解决假溢出问题的方法就是,如果rear到了数组尾部,数组前面部分还有空间的话,rear可以指向前面的位置。
在这里插入图片描述
顺序队列中,我们说front==rear的时候队列为空,循环队列中则不一样,也可能为满,如上图所示。解决办法有两种:

  1. 可以设置一个标志变量flag,当front==rear并且flag=0的时候队列为空,当front==rear并且flag=1的时候队列为满。
  2. 队列为空的时候就是front==rear,队列满的时候,我们保证数组还有一个空闲的位置,rear 就指向这个空闲位置,那么判断队列是否为满的条件就是: (rear+1) % QueueSize= front
public class MyQueue2 {
    private int maxSize ; //最大容量
    private int front;  //队列的头部
    private int rear ;  //队列的尾部
    private int arr[];  //存数据的数组

    //创建队列的构造器
    public MyQueue2(int arrmaxSize){
        maxSize = arrmaxSize;
        arr = new int[maxSize];
        front = 0 ;
        rear = 0 ;
    }
    //判断队列是否是满的
    public boolean isFull(){
        return (rear+1)%maxSize == front ;
    }
    //判断队列是否为空
    public boolean isEmpty(){
        return rear == front ;
    }
    //相队列里面添加数据
    public void add(int num){
        if (isFull()){
            System.out.println("队列已经满了,不能加入数据!");
        }else {
            arr[rear] = num;
            rear = (rear+1)%maxSize;
        }
    }
    public int poll(){
        if (isEmpty()){
            throw new RuntimeException("对列为空,没有数据!");//throw完了会返回
        }else{
            //1、先保存front这个变量
            int value = arr[front];
            //2、front往后移
            front = (front+1)%maxSize;
            return value;
        }
    }
    //显示队列的长度
    public int length(){
        return (rear+maxSize-front)%maxSize;
    }

    //显示队列的头部,不是取出数据
    public int peek(){
        if (isEmpty()){
            throw new RuntimeException("对列为空,没有数据!");
        }else {
            return arr[front];
        }
    }
}

Java中的queue

//将元素插入队列,如果队列已满,则抛出一个IIIegaISlabEepeplian异常
boolean add(E e);

//将元素插入队列,如果队列已满,返回false
boolean offer(E e);

//将队首的元素删除,队列为空则抛出异常
E remove();

//将队首的元素删除,队列为空则返回null
E poll();

//获取队首元素,但不移除,队列为空则抛出异常
E element();

//获取队首元素,但不移除,队列为空则返回null
E peek();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值