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

队列及循环队列为什么用空一个元素的位置 队列,循环队列为什么用空一个元素的位置 队列介绍 1)队列是一个有序列表,可以用数组或是链表表示。 2)遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出。 front及rear分别记录队列前后端的下标,front随着数据的输出而改变,而rear则是随着数据输入而改变。 代码实现 import java.util.Scanner; public class ArrayQueueDemo { public static void main(String[] args) { 阅读详情

什么是队列

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

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

队列中通常需要定义两个指针: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) {//初始化
        this.size = size;
        data = new Object[size];
        head = -1;
        tail = -1;
    }

Python数据结构与算法基础|第四期:代码实现——循环队列的引入原因以及其顺序结构的Python实现 为什么要引入循环队列 上一次的博客中我们实现了队列的顺序存储结构与链式存储结构。仔细想想,我们在实现这些队列甚至在以前实现栈的时候,并没有考虑我们实际存储空间的大小。在实现栈的时候,我们假设入栈的元素总是有空间的,如在顺序存储中,我们假设此时的栈顶总是可以开盘一块与它相邻的存储空间来安放新的后件;而在链式存储结构中我们假设现在的栈底总是存在可以找到一块存储空间来安放新的后件的数据域域指针域。同时,... 阅读详情

相关推荐

顺序循环队列的表示和实现(少用一个存储空间)

头文件:函数的声明 #include #include #define QUEUESIZE 100 typedef char ElemType; typedef struct { ElemType queue[QUEUESIZE]; int front; int rear; }SeqQueue; void InitQueue(SeqQueue *SCQ); int QueueEmp

罗小黑の窝 4650

循环队列中判断队满与队空

在引用循环队列前,我们需要了解队列是如何线性实现的。 简单地讲,便是当队列为空时,front = rear = 0,每当插入元素尾指针+1,删除元素是头指针-1。但是,我们会发现一个问题,如上面的第四个图,0,1,2三个空间并没有使用。因此,为了占用该空间,我们使用了循环队列来实现。 循环队列原理图: 我们可以发现,当循环队列属于上图的d1情况时,是无法判断当前状态是队空还是队满。为了

QAQ 6万+

3.4.3 循环队列之动态存储空间 (3 )

/* c3-4.h 队列的顺序存储结构(出队元素时不移动元素,只改变队头元素的位置) */  #define QUEUE_INIT_SIZE 10 /* 队列存储空间的初始分配量 */  #define QUEUE_INCREMENT 2 /* 队列存储空间的分配增量 */  typedef struct  {    QElemType *base; /* 初始化的动态分配存储空间 */

SJMP 1874

浙大数值分析lab2

最可怕的一道题,题目是这样的 Root of a Polynomial A polynomial of degree nnn has the common form as p(x)=cnxn+cn−1xn−1+⋯+c1x+c0p(x)=c_n x^n + c_{n-1} x^{n-1} + \cdots + c_1 x + c_0p(x)=c​n​​x​n​​+c​n−1​​x​

yao_zou的博客 4795

如何理解界面陷阱电荷呢(interface trapped charge)和费米钉扎效应?

如何理解界面陷阱电荷呢?(interface trapped charge) 我们在学半导体物理的时候经常对各种界面态和陷阱分不清楚,然而这却是半导体中最为关键的知识点之一。我这路主要介绍一下如何比较直观地理解界面陷阱电荷,应该也有叫界面态,快态之类的。 在介绍界面陷阱电荷之前,我们可以回顾一下施主(donor)和受主(acceptor)的概念。在si中如果掺杂了n型杂质P,那么P由于最外层电子有5个,有一个电子比较容易跑走,成为自由移动的导电电子,在能带中可以表现为电子从禁带中的能级跃迁到导带,这种情况我

Wang_P_P的博客 3万+

银河麒麟服务器操作系统V10SP3 U盘安装中“基础软件仓库错误”的排查与修复指南

本文针对在无网络环境下使用U盘安装银河麒麟服务器操作系统V10SP3时,遇到的“基础软件仓库错误”问题,提供了详细的排查与修复指南。核心解决方案是通过进入救援模式,使用lsblk命令确定U盘实际设备路径,并在系统引导时手动添加inst.repo内核参数来指定安装源,从而绕过安装程序的自动探测故障,确保安装流程顺利进行。

ik67890123的博客 1193

单目视觉定位:深入解析PNP算法在机器人导航中的实战应用

本文深入解析了PNP算法在机器人单目视觉定位中的核心原理与实战应用。通过拆解坐标变换四步,详细阐述了如何从二维图像点反求相机三维位姿。文章结合OpenCV的solvePnP函数,提供了算法选择、参数调优及结果后处理的实用指南,并针对机器人导航中的特征匹配、尺度不确定性等挑战,给出了鲁棒性优化与实时性平衡的解决方案。

weixin_29083649的博客 419

Linux下科大讯飞离线语音识别SDK从下载到实战(附常见问题解决)

本文详细介绍了在Linux系统下,如何从科大讯飞开放平台获取离线语音识别SDK,完成环境准备、编译部署到实战开发的完整流程。文章重点解析了SDK目录结构、语法词典定制、示例代码修改,并针对开发中常见的“词典加载失败”、音频格式、交叉编译及性能优化等问题提供了深度解决方案,助力嵌入式与IoT开发者快速实现稳定可靠的离线命令识别功能。

honey的博客 1239

解锁RK3588视觉潜能:RGA硬件加速库实战指南

本文深入探讨了如何利用RK3588芯片内置的RGA硬件加速库,解决视觉应用中图像预处理的性能瓶颈。通过实战指南,详细介绍了RGA库在YUV转RGB、图像缩放等核心操作上的应用,相比CPU软处理可大幅降低延迟与CPU占用,从而充分释放RK3588的NPU算力,构建高效的AI视觉预处理流水线。

zeta9的博客 669

目标检测YOLO实战应用案例100讲-跨模态、多级别融合的RGB-D显著目标检测方法研究(续)

在第二章介绍了本研究的跨模态特征融合方法,第二章对于多级别特征的融合, 使用的是与基线模型baseline相同的方法:相邻级别的特征中,高级特征进行上采 样到与低级特征相同的尺度,再将高级特征通过降维得到与低级特征相同的通道数 量,最后对二者进行特征叠加,如此自顶向下的进行多级别的特征融合。本章主要 介绍本研究在特征层面的另一发现,并基于此发现引出的本文的第二个创新点:多 级别特征的融合方法。另外,在网络最深层,本文设计了一个新的模块来获取大的 感受野,对于大尺度目标能够增加更多语义信息,提升检测效果。 骨

qq_36130719的博客 466

详解AXI4-Lite接口(3)--AXI4-Lite接口IP源码仿真及分析(Master接口)

通过本文您会学到:1、了解AXI4-Lite_Master接口的逻辑实现;2、加深Xilinx IP、仿真工具的使用;3、提高阅读时序图的能力。

孤独的单刀 6445

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: Java中Volatile的原理及使用
superjava_
博客等级 码龄5年 254粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值