数据结构——队列练习题
在C语言中,.和->运算符用于访问结构体的成员变量。它们之间的区别在于:.运算符用于访问结构体变量的成员。->运算符用于访问结构体指针变量的成员
1a(rear指向队尾元素后一位,判空判满时牺牲一个存储单元)
首先我们考虑1a的情况下在牺牲一个存储单元rear指向队尾元素后一个位置该怎么实现队列的基本操作,当rear指向队尾元素的后一位时,队列的实现需要牺牲一个存储单元来区分队列是空还是满
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定义队列中元素的最大个数typedef struct {int data[MaxSize]; // 用静态数组存放队列元素int front, rear; // 队头指针和队尾指针
} SqQueue;// 初始化队列
void InitQueue(SqQueue* Q) {Q->front = Q->rear = 0; // 初始时队头、队尾指针指向0
}// 判断队列是否为空
bool QueueEmpty(SqQueue* Q) {return Q->front == Q->rear; // 判空条件:队头指针等于队尾指针
}// 判断队列是否已满
bool QueueFull(SqQueue* Q) {return (Q->rear + 1) % MaxSize == Q->front; // 判满条件:队尾指针后移一位后等于队头指针
}// 入队
bool EnQueue(SqQueue* Q, int x) {if (QueueFull(Q)) { // 判断队满return false; // 队满报错} else {Q->data[Q->rear] = x; // 新元素插入队尾Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针后移return true;}
}// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判断队空return false; // 队空则报错} else {Q->front = (Q->front + 1) % MaxSize; // 队头指针后移*x = Q->data[Q->front]; // 获取队头元素return true;}
}// 获得队头元素的值,用x返回
bool GetHead(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判断队空return false; // 队空则报错} else {*x = Q->data[Q->front]; // 获取队头元素return true;}
}
在这个实现中,队列满的条件是队尾指针后移一位后等于队头指针。这意味着队列的实际容量是MaxSize - 1
,因为一个存储单元被用来区分队列是空还是满。
2a(rear指向队尾元素,判空判满时牺牲一个存储单元)
当rear指向队尾元素时,队列的实现不需要牺牲额外的存储单元来区分队列是空还是满。在这种情况下,队列的实际容量就是MaxSize
,因为所有的存储单元都可以用来存储元素。
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定义队列中元素的最大个数typedef struct {int data[MaxSize]; // 用静态数组存放队列元素int front, rear; // 队头指针和队尾指针
} SqQueue;// 初始化队列
void InitQueue(SqQueue* Q) {// 初始时队头指针指向0// 队尾指针指向数组尾元素Q->front = 0;Q->rear = MaxSize - 1;
}// 判断队列是否为空
bool QueueEmpty(SqQueue* Q) {if (Q->rear == Q->front) { // 判空条件return true;} else {return false;}
}// 判断队列是否已满
bool QueueFull(SqQueue* Q) {if ((Q->rear + 1) % MaxSize == Q->front) { // 判满条件return true;} else {return false;}
}// 入队
bool EnQueue(SqQueue* Q, int x) {if (QueueFull(Q)) { // 判断队满return false; // 队满报错} else {Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针后移Q->data[Q->rear] = x; // 新元素插入队尾return true;}
}// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判断队空return false; // 队空则报错} else {Q->front = (Q->front + 1) % MaxSize; // 队头指针后移*x = Q->data[Q->front]; // 获取队头元素return true;}
}// 获得队头元素的值,用x返回
bool GetHead(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判断队空return false; // 队空则报错} else {*x = Q->data[(Q->front + 1) % MaxSize]; // 获取队头元素return true;}
}
在这个实现中,队列满的条件是队尾指针后移一位后等于队头指针。这意味着队列的实际容量是MaxSize
,因为所有的存储单元都可以用来存储元素 ,与1a的相比主要改变了入队和初始化的操作,入队的时候,rear需要先往后一位,再接受新的数据。
1b(rear指向队尾元素后一位,增加size变量记录长度)
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定义队列中元素的最大个数typedef struct {int data[MaxSize]; // 用静态数组存放队列元素int front, rear; // 队头指针和队尾指针int size;//增加一个size记录队列的长度
} SqQueue;// 初始化队列
void InitQueue(SqQueue* Q) {// 初始时队头、队尾指针指向0Q->rear = Q->front = 0;Q->size = 0;
}// 判断队列是否为空
bool QueueEmpty(SqQueue Q) {if (Q->size == 0) { // 判空条件return true;}else {return false;}bool QueueFull(SqQueue Q) {if (Q->size==MaxSize) { // 判满条件return true;}else {return false;}
}// 入队
bool EnQueue(SqQueue* Q, int x) {if (QueueFull(*Q)) { // 判断队满return false; // 队满报错}else {Q->data[Q->rear] = x; // 新元素插入队尾Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针加1取模,队尾指针后移Q->size = Q->size + 1; // 队列长度加1return true;}
}// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {if (QueueEmpty(*Q)) { // 判断队空return false; // 队空则报错}else {*x = Q->data[Q->front];Q->front = (Q->front + 1) % MaxSize; // 队头指针后移Q->size = Q->size - 1; // 队列长度减1return true;}
}
// 获得队头元素的值,用x返回
bool GetHead(SqQueue Q, int* x) {if (QueueEmpty(*Q)) { // 判断队空return false; // 队空则报错}else {*x = Q.data[Q.front];return true;}
}
2b(rear指向队尾元素,增加size变量记录长度)
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定义队列中元素的最大个数typedef struct {int data[MaxSize]; // 用静态数组存放队列元素int front, rear; // 队头指针和队尾指针int size;//增加一个size记录队列的长度
} SqQueue;// 初始化队列
void InitQueue(SqQueue* Q) {// 初始时队头、队尾指针指向Q->front = 0;Q->rear = MaxSize - 1;Q->size = 0;
}// 判断队列是否为空
bool QueueEmpty(SqQueue Q) {if (Q->size == 0) { // 判空条件return true;}else {return false;}bool QueueFull(SqQueue Q) {if (Q->size==MaxSize) { // 判满条件return true;}else {return false;}
}// 入队
bool EnQueue(SqQueue* Q, int x) {if (QueueFull(*Q)) { // 判断队满return false; // 队满报错}else {Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针加1取模,队尾指针后移Q->data[Q->rear] = x; // 新元素插入队尾Q->size = Q->size + 1; // 队列长度加1return true;}
}// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {if (QueueEmpty(*Q)) { // 判断队空return false; // 队空则报错}else {*x = Q->data[Q->front];Q->front = (Q->front + 1) % MaxSize; // 队头指针后移Q->size = Q->size - 1; // 队列长度减1return true;}
}
// 获得队头元素的值,用x返回
bool GetHead(SqQueue Q, int* x) {if (QueueEmpty(*Q)) { // 判断队空return false; // 队空则报错}else {*x = Q.data[Q.front];return true;}
}
3a(rear指向队尾元素后一位,判空判满时添加一个tag标签标记)
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定义队列中元素的最大个数typedef struct {int data[MaxSize]; // 用静态数组存放队列元素int front, rear; // 队头指针和队尾指针int tag;//tag标签用于标记,0=出队,1=入队
} SqQueue;// 初始化队列
void InitQueue(SqQueue* Q) {Q->front = Q->rear = 0; // 初始时队头、队尾指针指向0Q->tag = 0;
}// 判断队列是否为空
bool QueueEmpty(SqQueue* Q) {return (Q->front == Q->rear&&Q->tag==0); // 判空条件:队头指针等于队尾指针
}// 判断队列是否已满
bool QueueFull(SqQueue* Q) {return ((Q->rear + 1) % MaxSize == Q->front&&Q->tag==1); // 判满条件:队尾指针后移一位后等于队头指针
}// 入队
bool EnQueue(SqQueue* Q, int x) {if (QueueFull(Q)) { // 判断队满return false; // 队满报错}else {Q->data[Q->rear] = x; // 新元素插入队尾Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针后移Q->tag = 1;//入队后tag变为1;return true;}
}// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判断队空return false; // 队空则报错}else {Q->front = (Q->front + 1) % MaxSize; // 队头指针后移*x = Q->data[Q->front]; // 获取队头元素Q->tag = 1;//出队后tag变为1;return true;}
}// 获得队头元素的值,用x返回
bool GetHead(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判断队空return false; // 队空则报错}else {*x = Q->data[Q->front]; // 获取队头元素return true;}
}
3b(rear指向队尾元素,判空判满时添加一个tag标签标记)
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 // 定义队列中元素的最大个数typedef struct {int data[MaxSize]; // 用静态数组存放队列元素int front, rear; // 队头指针和队尾指针int tag;//tag标签用于标记,0=出队,1=入队
} SqQueue;// 初始化队列
void InitQueue(SqQueue* Q) {Q->front = 0//初始时队头指针指向队头元素Q->rear = MaxSize-1;//初始时队尾指针指向队尾元素Q->tag = 0;
}// 判断队列是否为空
bool QueueEmpty(SqQueue* Q) {return (Q->front == Q->rear && Q->tag == 0); // 判空条件:队头指针等于队尾指针
}// 判断队列是否已满
bool QueueFull(SqQueue* Q) {return ((Q->rear + 1) % MaxSize == Q->front && Q->tag == 1); // 判满条件:队尾指针后移一位后等于队头指针
}// 入队
bool EnQueue(SqQueue* Q, int x) {if (QueueFull(Q)) { // 判断队满return false; // 队满报错}else {Q->rear = (Q->rear + 1) % MaxSize; // 队尾指针后移Q->data[Q->rear] = x; // 新元素插入队尾Q->tag = 1;//入队后tag变为1;return true;}
}// 出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判断队空return false; // 队空则报错}else {Q->front = (Q->front + 1) % MaxSize; // 队头指针后移*x = Q->data[Q->front]; // 获取队头元素Q->tag = 1;//出队后tag变为1;return true;}
}// 获得队头元素的值,用x返回
bool GetHead(SqQueue* Q, int* x) {if (QueueEmpty(Q)) { // 判断队空return false; // 队空则报错}else {*x = Q->data[Q->front]; // 获取队头元素return true;}
}
相关文章:

数据结构——队列练习题
在C语言中,.和->运算符用于访问结构体的成员变量。它们之间的区别在于:.运算符用于访问结构体变量的成员。->运算符用于访问结构体指针变量的成员 1a(rear指向队尾元素后一位,判空判满时牺牲一个存储单元) 首先…...

PLL和CDR的内部结构及其区别
比较PLL和CDR的内部结构及其区别: 基本结构: PLL(相位锁定环): 相位检测器环路滤波器压控振荡器(VCO)分频器(可选,用于频率合成) CDR(时钟数据恢复…...

HarmonyOS APP应用开发项目- MCA助手(Day02持续更新中~)
简言: gitee地址:https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5注:…...
华为交换机 LACP协议
华为交换机支持的LACP协议,即链路聚合控制协议,是一种基于IEEE 802.3ad标准的动态链路聚合与解聚合的协议。它允许设备根据自身配置自动形成聚合链路并启动聚合链路收发数据。 在LACP模式下,链路聚合组能够自动调整链路聚合,维护…...

node 下载文件到网络共享目录
1、登录网络共享计算器 2、登录进入后复制要存储文件的目录路径 例如: \\WIN-desktop\aa\bb\cc 3、node 下载后写入网络共享目录 注意(重要):在使用UNC路径时,请确保你正确转义了反斜杠(使用两个反斜杠来表示一个&…...

STM32基础知识
一.STM32概述 第一款STM32单片机发布的时间为2007年6月11日。由意法半导体(ST)公司推出,是STM32系列中的首款产品,具体型号为STM32F1,它是一款基于Cortex-M内核的32位微控制器(MCU)。 STM32F1…...
安装docker版rabbitmq 3.12
本文介绍在Ubuntu22中安装docker版rabbitmq 3.12。 一、拉取镜像 docker pull rabbitmq:3.12.14-management二、创建数据目录和docker-compose文件 创建目录: cd /root mkdir rabbitmq-docker cd rabbitmq-docker mkdir data chmod 777 data创建docker-compose配…...

c++重定向输出和输出(竞赛讲解)
1.命令行重定向 在命令行中指定输出文件 指令 .\重定向学习.exe > 1.txt 效果 命令行输入和输出 指令 .\重定向学习.exe < 2.txt > 1.txt 效果 代码 #include<bits/stdc++.h> using namespace std; int n; int main(){cin>>n;for(int i=0;i<n;i…...

实在智能对话钉钉:宜搭+实在Agent,AI时代的工作方式
比起一个需求需要等产品、技术排期,越来越多的人开始追求把自己武装成「全能战士」,通过低代码工具一搭,一个高效的工作平台便产生了。 宜搭是钉钉自研的低代码应用构建平台,无论是专业开发者还是没有代码基础的业务人员…...
MySQL的Docker部署方式
说明:Docker部署MySQL主要是简单快速,不会对电脑系统造成污染。假如你的本地没有Docker,或者你不会使用Docker,则使用PyCharm去启动MySQL,或者直接在本机安装MySQL都是可以的。最重要的是,你要有一个MySQL环境…...

光伏电站数据采集方案(基于工业路由器部署)
一、方案概述 本方案采用星创易联SR500工业路由器作为核心网关设备,实现对光伏电站现场数据的实时采集、安全传输和远程监控。SR500具备多接口、多功能、高可靠性等特点,能够满足光伏电站数据采集的各种需求。(key-iot.com/iotlist/sr500…...
一文让你彻底搞懂什么是CDN
一、引言 在当今互联网时代,网站的加载速度和稳定性是用户体验的关键因素之一。而CDN(Content Delivery Network,内容分发网络)作为提升网站性能的重要技术手段,受到了广泛的关注和应用。本篇博客将深入探讨CDN的工作…...
1023记录
米哈游二面 自动化测试中自动化驱动的能力? pytest的驱动能力: 1,自动发现测试用例:以"test_"开头的Python文件、以"Test"开头的类和以"test_"开头的函数,将它们识别为测试用例 2&…...

【并发编程JUC】AQS详解
定义理解 AQS,全称为AbstractQueuedSynchronizer,是Java并发包(java.util.concurrent)中的一个框架级别的工具类,用于构建锁和同步器。它是许多同步类的基础,如ReentrantLock、Semaphore、CountDownLatch等…...

如何找BMS算法、BMS软件的实习
之前一直忙,好久没有更新了,今天就来写一篇文章来介绍如何找BMS方向的实习,以及需要具备哪些条件,我的实习经历都是在读研阶段找的,读研期间两段的实习经历再加上最高影响因子9.4分的论文,我的秋招可以说是…...

AR视频技术与EasyDSS流媒体视频管理平台:打造沉浸式视频体验
随着增强现实(AR)技术的飞速发展,其在各个领域的应用日益广泛。这项技术通过实时计算摄影机影像的位置及角度,将虚拟信息叠加到真实世界中,为用户带来超越现实的感官体验。AR视频技术不仅极大地丰富了我们的视觉体验&a…...
每天一个数据分析题(三百九十九)- 逻辑回归
逻辑回归中,若选0.5作为阈值区分正负样本,其决策平面是( ) A. wxb= 0 B. wxb= 1 C. wxb= -1 D. wxb= 2 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点…...
【ARMv8/v9 GIC 系列 5.2 -- GIC 分组介绍:Group 0 |Group 1| Non-Secure Group 1】
请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC Interrupt grouping中断分组配置寄存器GIC 中断分组介绍Group 0(安全组0)Group 1(安全组1)Non-Secure Group 1(非安全组1)总结及例子GIC Interrupt grouping ARM GICv3 通过中断分组机制,与ARMv8异常模型和安全模型进行…...
前端代码规范 - 日志打印规范
在前端开发中,随着项目迭代升级,日志打印逐渐风格不一,合理的日志输出是监控应用状态、调试代码和跟踪用户行为的重要手段。一个好的日志系统能够帮助开发者快速定位问题,提高开发效率。本文将介绍如何在前端项目中制定日志输出规…...

C# 类型转换之显式和隐式
文章目录 1、显式类型转换2. 隐式类型转换3. 示例4. 类型转换的注意事项5. 类型转换的应用示例总结 在C#编程中,类型转换是一个核心概念,它允许我们在程序中处理不同类型的数据。类型转换可以分为两大类:显式类型转换(Explicit Ca…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...