循环队列c代码实现

2023-05-16

循环队列的抽象数据类型

	ADT 队列(Queue)
	Data 
		同线性表。元素具有相同的类型,相邻元素具有前驱和后继的关系
	Operator
		InitQueue(*Q):初始化操作,建立一个空队列Q
		DestroyQueue(*Q):若队列存在则销毁他
		ClearQueue(*Q):将队列清空
		QueueEmpty(Q):若队列为空,返回true。否则返回false
		GetHead(Q,*e):若队列存在且非空,用e返回队列Q的队头元素
		EnQueue(*Q,e):若队列存在,插入新元素e到队列Q中并成为队尾元素。
		DeQueue(*Q,*e):删除队列Q中对头元素,并用e返回其值
		QueueLength(Q):返回队列的元素个数
	endADT

test.hpp

#ifndef TEST_H_
#define TEST_H_
#include"malloc.h"
#define MAXSIZE 100
typedef int QElemType;

typedef struct 
{
	QElemType data[MAXSIZE];
	int front;
	int rear;

}SqQueue;

//InitQueue(*Q) :初始化操作,建立一个空队列Q
SqQueue * initQueue();
//DestroyQueue(*Q) : 若队列存在则销毁他
void destroyQueue(SqQueue * Q);
//ClearQueue(*Q) : 将队列清空
void ClearQueue(SqQueue * Q);
//QueueEmpty(Q) : 若队列为空,返回true。否则返回false
bool queueEmpty(const SqQueue Q);
//GetHead(Q, *e) : 若队列存在且非空,用e返回队列Q的队头元素
void getHead(const SqQueue Q, QElemType *e);
//EnQueue(*Q, e) : 若队列存在,插入新元素e到队列Q中并成为队尾元素。
void enQueue(SqQueue * Q, const QElemType e);
//DeQueue(*Q, *e) : 删除队列Q中对头元素,并用e返回其值
void deQueue(SqQueue * Q, QElemType *e);
//queueLength(Q) : 返回队列的元素个数
int queueLength(const SqQueue Q);
#endif
#pragma once

test.cpp

#include"test.h"
//InitQueue(*Q) :初始化操作,建立一个空队列Q
SqQueue * initQueue() {

	SqQueue * temp = (SqQueue *)malloc(sizeof(SqQueue));
	temp->front = 0;
	temp->rear = 0;
	return temp;
}

//DestroyQueue(*Q) : 若队列存在则销毁他
void destroyQueue(SqQueue * Q) {

	if (Q->front != Q->rear)
		free(Q);

}

//ClearQueue(*Q) : 将队列清空
void ClearQueue(SqQueue * Q) {

	//这个没有很大意义

}

//QueueEmpty(Q) : 若队列为空,返回true。否则返回false
bool queueEmpty(const SqQueue Q) {

	if (Q.front == Q.rear )
		return true;
	else
		return false;

}

//GetHead(Q, *e) : 若队列存在且非空,用e返回队列Q的队头元素
void getHead(const SqQueue Q, QElemType *e) {

	if (Q.front == Q.rear)
		return;
	*e = Q.data[Q.front];

}

//EnQueue(*Q, e) : 若队列存在,插入新元素e到队列Q中并成为队尾元素。
void enQueue(SqQueue * Q, const QElemType e) {

	if ((Q->rear + 1) % MAXSIZE == Q->front)//队列已满
		return;
	Q->data[Q->rear] = e;
	Q->rear = (Q->rear + 1) % MAXSIZE;

}

//DeQueue(*Q, *e) : 删除队列Q中对头元素,并用e返回其值
void deQueue(SqQueue * Q, QElemType *e) {

	if (Q->front == Q->rear)
		return;
	*e = Q->data[Q->front];
	Q->front = (Q->front + 1) % MAXSIZE;

}

//queueLength(Q) : 返回队列的元素个数
int queueLength(const SqQueue Q) {

	return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}

main.cpp

#include<iostream>
#include"test.h"

void showQueue(const SqQueue Q);

int main()
{
	SqQueue * root = initQueue();
	std::cout << "队列是否为空: " << queueEmpty(*root) << std::endl;
	std::cout << "队列的长度为: " << queueLength(*root) << std::endl;
	showQueue(*root);
	enQueue(root, 1);
	enQueue(root, 2);
	enQueue(root, 3);
	enQueue(root, 4);
	enQueue(root, 5);
	enQueue(root, 6);
	enQueue(root, 7);
	enQueue(root, 8);
	std::cout << "队列是否为空: " << queueEmpty(*root) << std::endl;
	std::cout << "队列的长度为: " << queueLength(*root) << std::endl;
	showQueue(*root);
	int temp;
	deQueue(root, &temp);
	std::cout << "出队元素为: " << temp << std::endl;
	std::cout << "队列是否为空: " << queueEmpty(*root) << std::endl;
	std::cout << "队列的长度为: " << queueLength(*root) << std::endl;
	showQueue(*root);
	return 0;
}

void showQueue(const SqQueue Q) {

	if (queueEmpty(Q))
	{
		std::cerr << "空队列\n";
		return;
	}
	int start = Q.front;
	for (int i = start; i < queueLength(Q); i++)
		std::cout << Q.data[i] << " ";
	std::cout << std::endl;

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

循环队列c代码实现 的相关文章

  • 四旋翼飞行器——电调篇

    1 电调的作用 xff1a 电调的作用就是将飞控板的PWM控制信号转变为电流信号 xff0c 以控制电机的转速 因为电机的电流是很大的 xff0c 通常每个电机正常工作时 xff0c 平均有3A左右的电流 xff0c 如果没有电调的存在 x
  • GPS 0183协议GGA、GLL、GSA、GSV、RMC、VTG、ZDA、DTM

    NMEA协议是为了在不同的GPS xff08 全球定位系统 xff09 导航设备中建立统一的BTCM xff08 海事无线电技术委员会 xff09 标准 xff0c 由美国国家海洋电子协会 xff08 NMEA The National M
  • Github的branch是什么

    Github的branch是什么
  • extern C的作用详解

    extern 34 C 34 的主要作用就是为了能够正确实现C 43 43 代码调用其他C语言代码 加上extern 34 C 34 后 xff0c 会指示编译器这部分代码按C语言的进行编译 xff0c 而不是C 43 43 的 由于C 4
  • Linux socket CAN编程示例

    如下所示 xff0c 代码展示了Linux下CAN的发送和接收 xff1a include lt stdio h gt include lt stdlib h gt include lt string h gt include lt uni
  • windows下面安装git

    注意在安装过程中选择override这个选项
  • QT中Map的使用

    Qt中的QMap介绍与使用 xff0c 在坛子里逛了一圈 xff0c 发现在使用QMap中 xff0c 出现过很多的问题 xff0c Map是一个很有用的数据结构 它以 键 值 的形式保存数据 在使用的时候 xff0c 通过提供字符标示 x
  • ubuntu 更新内核切换内核启动

    1 查看需要更新的内核命令 xff1a apt cache search linux 该命令将会显示所有可以获取的内核 2 安装内核 xff0c 假设你要安装的内核为2 6 39 0 xff0c 则使用下面的命令 sudo apt get
  • 多线程实现对同一个或多个文件的读写操作

    程序用途 xff1a 实现多个线程对同一文件的读写操作 程序代码 xff1a test c 该程序在Ubuntu下测试通过 include lt stdio h gt include lt pthread h gt include lt s
  • linux下设置共享目录

    Linux系统的文件或目录的共享功能是非常强大 xff0c 而且是非常灵活的 xff0c 其对权限的控制可以做到非常的细致 xff0c 当然如果你是通过命令行方式进行设置的 话 xff0c 那么对于刚接触linux系统的用户来说将是一件十分
  • shell 数组赋值

    shell编程 xff0c 给数组赋值及两个数组初始化与比较 bin sh output files 61 cat outfiles for i 61 0 i lt output files 64 43 43 i do echo 34 ar
  • vnc的两种配置方法及解决vnc连不上的情况

    1 vnc连不上的现象 xff1a Timed out waiting for a response from the computer 解决方法 xff1a sudo sbin iptables I INPUT 1 p TCP dport
  • linux制作本地镜像

    1 前提条件 xff1a 有安装linux系统的iso 2 添加yum文件 xff1a touch etc yum repos d iso repo iso name 61 CentOS releasever Media baseurl 6
  • 使用parted创建分区

    今天在网上查找分区方法 xff0c 发现都是用的fdisk xff0c 但自己使用总是出错 xff0c 后来请求大神帮忙 xff0c 发现了一个好用的工具 xff0c 这里把具体的使用过程记录下来 root 64 pc160 parted
  • “结构体名”和“结构体名是个指针”的区别

    经常看见下面这样的定义 xff1a typedef struct int a double b emp i pemp i typedef 了两个新的数据类型 xff08 结构体 xff09 xff0c 其中一个是指针方式的名字 int ma
  • 简答实用的宏的写法

    本篇文章主要实现打印参数的传递 xff0c 这里定义了一个宏 define debug printf format printf 34 s d 34 format 34 34 func LINE VA ARGS
  • RK1126从入门到放弃:(二)Buildroot说明

    一 目录介绍 buildroot arch 存放CPU架构相关的配置脚本 xff0c 如arm mips x86 xff0c 这些CPU相关的配置 xff0c 在制作工具链时 xff0c 编译uboot和kernel时很关键 board x
  • 二进制基础及位运算

    一 什么是二进制 二进制是计算机运算时所采用的数制 xff0c 基数是2 xff0c 也就是说它只有两个数字符号 xff0c 即0和1 如果在给定的数中 xff0c 除0和1外还有其他数 xff08 例如1061 xff09 xff0c 那
  • Django学习笔记2 HTTP协议

    HTTP协议 web前端系统和后端系统之间是通过HTTP协议进行通信的HTTP 协议全称是超文本传输协议 xff0c 英文是 Hypertext Transfer ProtocolHTTP 协议最大的特点是通讯双方分为客户端和服务端 由于目
  • VINS-Mono视觉初始化代码详解

    摘要 视觉初始化的过程是至关重要的 xff0c 如果在刚开始不能给出很好的位姿态估计 xff0c 那么也就不能对IMU的参数进行精确的标定 这里就体现了多传感器融合的思想 xff0c 当一个传感器的数据具有不确定性的时候 xff0c 我们需

随机推荐

  • 5G DTU 数据上传 无线通信

    5G数据采集上传DTU xff0c 和各种使用串口通信的用户设备进行连接 xff0c 通过无线网络进行数据云端上传实现远程实时在线监测 采用心跳包保持永久在线 xff0c 支持断线自动重连 自动重拨号等特点 5G DTU组网迅速灵活 xff
  • 5G DTU地下水水位监测

    地下水监管不当会造成地面沉降 地裂缝 岩溶塌陷 海水入侵 水质污染等危害 xff0c 掌握了解地下水水位 分布等状态 xff0c 响应可持续发展的号召 xff0c 提高地下水资源科学保护和合理利用 计讯物联地下水水位监测系统平台采用5GDT
  • 5g DTU 无线数传终端应用

    DTU无线数传终端TD210全网通2G 3G 4G网络 xff0c 实现串口数据与IP数据的转换 xff0c DTU作为串口数据的无线终端设备 xff0c 可广泛应用于各行各业 DTU无线数传终端TD210应用 第一 xff0c 农业领域
  • 使用L298N电机驱动器和Arduino控制步进电机

    在本文中 xff0c 您将学习如何使用L298N电动机驱动器控制步进电动机 该驱动板通常用于控制直流电动机 xff0c 但它还是控制步进电动机的廉价替代品 xff01 它可以控制大多数步进电机 xff08 例如NEMA 17 xff09 的
  • STM32串口通讯(接收完成一整个数据帧再将数据发送出去)

    STM32串口通信可以分为查询 xff0c 中断 xff0c DMA三种方式进行通讯 xff0c 本文主要就中断的方式进行讲解 采用中断的方式进行通讯时 xff0c 可以使能接受非空中断 xff08 RXNE xff09 xff0c 当接收
  • 树的先序、中序、后序遍历

    遍历分分先序 中序 后序 先序 xff1a 先访问根结点 左结点 右结点 中序 xff1a 先访问左结点 根结点 右结点 后序 xff1a 先访问左结点 右结点 根结点 先序 xff1a ABC 中序 xff1a BAC 后序 xff1a
  • 调整Arduino STM32的串口缓存大小的方法

    通常Arduino中调整串口缓存大小的方法是修改HardwareSerial h中的常量 其实根本无需修改系统core中的定义值 xff0c 只需要在代码最上方添加以下常量定义 xff0c 抢在HardwareSerial h之前定义缓存大
  • C++入门学习(头文件)

    1 C 43 43 中的头文件 1 1 标准库中的头文件 C 43 43 标准库中的一切内容都被放在名字空间std中 xff08 名字空间中的内容对外是不可见的 xff09 xff0c 但是带来了一个新问题 xff0c 无数现有的C 43
  • 用for循环实现delay延时原理

    void Delay10ms unsigned int c 误差 0us unsigned char a b for c gt 0 c c可以不用初始化 xff0c 因为默认传的参数即为初始化 for b 61 38 b gt 0 b fo
  • 解决ROS中运行gazebo出现process has died的情况

    项目场景 xff1a gazebo 1 process has died pid 397 exit code 255 cmd opt ros melodic lib gazebo ros gzserver e ode worlds empt
  • 使用Ventoy制作U盘启动项

    最近在安装linux镜像的时候遇到了使用UltraISO软件制作U盘启动盘无法使用的情况 下面介绍另外一个软件把U盘制作成启动盘Ventoy xff1a 下载地址 xff1a Ventoy 使用方法 xff1a 1 下载好Ventoy xf
  • git 快速入手

    目录 一 xff1a 初次使用git及github 二 xff1a 将github上下载的代码上传到自己的github仓库里 三 xff1a 使用HTTP上传自己写的项目至github git常用指令汇总 使用需求 xff1a 初次接触gi
  • 线程、进程、并发、cpu、gpu的联系

    1 线程和进程的区别 进程 xff1a 一个在内存中运行的应用程序 每个进程都有自己独立的一块内存空间 xff0c 一个进程可以有多个线程 比如在Windows系统中 xff0c 一个运行的xx exe就是一个进程 线程 xff1a 进程中
  • ubuntu系统安装cuda、cudnn、pytorch和libtorch

    1 安装cuda和cudnn 本机安装的cuda版本11 0 2 cudnn版本 v8 0 5 cu11 0 Ubuntu20 04下CUDA cuDNN的详细安装与配置过程 xff08 图文 xff09 ubuntu20 04安装cuda
  • 深度学习语法篇

    一 基本常识 图像的分辨率的通道数 分辨率和通道数是两个不同的概念 分辨率指的是图像的像素数量 xff0c 它反映了图像的清晰度和细节程度 例如 xff0c 一个分辨率为64x64的图像意味着它有64个像素行和64个像素列 xff0c 总共
  • 第二讲:线性表示及坐标

    第二讲 xff1a 线性表示及坐标 一 线性表示 1 线性表示定义 xff1a 设 是线性空间V中的向量 xff0c 若存在V中一组向量 1 xff0c 2 xff0c xff0c n xff0c 及一组数x1 xff0c x2 xff0c
  • 快速理解掌握指针

    p gt next 61 q 像这种语句 xff0c 表示改变了p后面的连接关系 p 61 q gt next 这类语句 xff0c 没改变连接关系 xff0c 只是赋值而已 解读代码中指针所代表的节点之间的前后连接关系 只要输出该指针对应
  • 第三讲:子空间

    第三讲 xff1a 子空间 一 子空间定义 1 子空间 xff1a 设V是数域F上的线性空间 xff0c W是V的子集 xff0c 若对W中的任意元素 xff0c 及数K F xff0c 按V中的加法和数乘有 xff1a 1 xff09 4
  • Qt多线程之线程之间的传递数据

    hpp span class token macro property span class token directive keyword ifndef span MAINWINDOW H span span class token ma
  • 循环队列c代码实现

    循环队列的抽象数据类型 ADT 队列 xff08 Queue xff09 Data 同线性表 元素具有相同的类型 xff0c 相邻元素具有前驱和后继的关系 Operator span class token function InitQue