为什么循环队列要浪费一个存储空间

什么是队列

队列和数组,链表,栈一样都是属于线性数据结构,而队列又和栈比较相似,都属于操作受限的数据结构,其中栈是“后入先出”,而队列是“先进先出”。

和栈一样,队列也仅有两个基本操作:入队和出队(栈则是入栈和出栈)。往队列中放元素称之为入队,往队列中取元素称之为出队,然而相对于栈来说,队列又会复杂一点。

队列中通常需要定义两个指针:head 和 tail(当然,也有称之为:front 和 rear)分别用来表示头指针和尾指针。初始化队列时,head 和 tail 相等,当有元素入队时,tail 指针往后移动一位,当有元素出队时,head 指针往后移动一位。

1642136923(1).png

队空和队满

根据上面的队列初始化和入队出队的过程,我们可以得到以下三个关系:

  • 初始化队列时:head=tail=-1(这里也可以设置为 0,看具体实现)。
  • 队列满时:tail=size-1(其中 size 为初始化队列时队列的大小)。
  • 队列空时:head=tail(比如上图中的第一和第三个队列)。

队列的实现

和栈一样,队列也可以通过数组或者链表来实现,通过数组来实现的队列我们称之为“顺序队列”,通过链表实现的队列称之为“链式队列”。

数组实现队列

package com.lonely.wolf.note.queue;

/**
 * 基于数组实现自定义单向队列。FIFO(first in first out)先进先出
 * @author lonely_wolf
 * @version 1.0
 * @date 2021/12/26
 * @since jdk1.8
 */
public class MyQueueByArray<E> {
    public static void main(String[] args) {
        MyQueueByArray myQueue = new MyQueueByArray(3);
        System.out.println("队列是否为空:" + myQueue.isEmpty());//输出:true
        myQueue.enqueue(1);
        myQueue.enqueue(2);
        myQueue.enqueue(3);
        System.out.println("队列是否已满:" + myQueue.isFull());//输出:true
        System.out.println("第1次出队:" + myQueue.dequeue());//输出:1
        System.out.println("第2次出队:" + myQueue.dequeue());//输出:2
        System.out.println("第3次出队:" + myQueue.dequeue());//输出:3
        System.out.println("队列是否为空:" + myQueue.isEmpty());//输出:true
        System.out.println("队列是否已满:" + myQueue.isFull());//输出:true
    }

    private Object[] data;
    private int size;//队列长度
    private int head;//队列头部
    private int tail;//队列尾部

    public MyQueueByArray(int size) {//初
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值