4. 数据结构——队列的操作实现

embedded/2024/10/25 12:18:30/

队列操作实现:循环队列和链队列的初始化、求长度、出队、入队、去队头元素等操作。

1. 循环队列

这里通过浪费一个空间来区别队满和队空。

❗注意rear和front的指针循环加操作、队满的判断、队空的判断,求队长。(因为是循环队列,循环,所以这些操作和平时的操作不一样,需要多注意一些)。

//循环队列
#include<stdio.h>
#include<stdlib.h>#define OK 1
#define OVERFLOW -2
#define ERROR 0
#define MAXSIZE 100typedef int ElemType;
typedef int Status; 
typedef struct{ElemType *base;  //存储空间的基地址int front,rear;  //头指针、尾指针 
}SqQueue; //1. 初始化循环队列
Status InitQueue(SqQueue &Q){Q.base=(ElemType*)malloc(sizeof(ElemType)*MAXSIZE);  //分配MAXSIZE空间 
//	Q.base=new ElemType[MAXSIZE];if(!Q.base) exit(OVERFLOW); Q.front=Q.rear=0;  //初始化队头队尾指针指向0return OK;
}//2.求循环队列的长度
//如果Q.rear>Q.front ,length=Q.rear-Q.front;
//如果Q.rear<Q.front, length=MAXSIZE-Q.front+Q.rear 
int QueueLength(SqQueue Q){return (Q.rear-Q.front+MAXSIZE)%MAXSIZE; 
}//3.入队
Status EnQueue(SqQueue &Q,ElemType e){if((Q.rear+1)%MAXSIZE==Q.front)  //牺牲一个存储空间判断(和队空判断区分开来) return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXSIZE;return OK; 
} //4.出队
Status DeQueue(SqQueue &Q,ElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXSIZE;return OK;
} //5.取队头元素
Status GetHead(SqQueue Q,ElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];return OK;
} 

2. 链队列(带头节点)

出队的时候需要注意一下当链队列中只有一个元素的情况,需要将rear指针同样指向front.

//链队列(带头结点) 
#include<stdio.h>
#include<stdlib.h>#define OK 1
#define OVERFLOW -2
#define ERROR 0typedef int ElemType;
typedef int Status;
//定义一个链表 
typedef struct QNode{ElemType data;struct QNode *next;
}QNode,*QueuePtr;//定义两个指针
typedef struct{QueuePtr front;  //队头指针QueuePtr rear;   //队尾指针 
}LinkQueue;//1.初始化
Status InitQueue(LinkQueue &Q){Q.front=Q.rear=(QNode*)malloc(sizeof(QNode));
//	Q.front=Q.rear=new QNode;Q.front->next=NULL;
//	Q.rear->next=NULL; //为什么不需要这步:因为在每次入队的时候都设计了rear->next=NULL return OK; 	
}//2. 入队
Status EnQueue(LinkQueue &Q,ElemType e){QueuePtr p=(QNode*)malloc(sizeof(QNode));p->data=e;Q.rear->next=p;p->next=NULL;Q.rear=p;return OK;
} //3.出队(抛弃一个空间用于判断是否为空) 
Status DeQueue(LinkQueue &Q,ElemType &e){if(Q.front==Q.rear)return ERROR; QueuePtr p=Q.front->next;  //要出队的位置 e=p->data;Q.front->next=p->next;
//	if(Q.front->next==NULL)  //使用这个条件判断也可,但是书上不是以这种方式,所以建议使用下面的代码 if(Q.rear==p)  //最后一个元素被删 Q.rear=Q.front;free(p);return OK;
} //5.取队头元素
Status GetHead(LinkQueue Q,ElemType &e){if(Q.rear==Q.front)  //队列为空 return ERROR;e=Q.front->next->data;return OK; 
} 


http://www.ppmy.cn/embedded/97980.html

相关文章

Python爬虫技术与K-means算法的计算机类招聘信息获取与数据分析

有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 目录 摘要.... 1 Abstract 2 1 引言.... 3 1.1 研究背景... 3 1.2 国内外研究现状... 4 1.3 研究目的... 5 1.4 研究意义... 7 2 关键技术理论介绍... 7 2.1 Python爬虫... 7 2.1 K-means…

金贝E-KA1M 5.5T卓越性能,引领行业新高度

金贝 E-KA1M 5.5t 主要适用于家庭、书房、办公室等对噪音有一定要求的环境。它在运行时噪音极低&#xff0c;不会打扰您的日常生活&#xff0c;无论是放在家中还是办公场所&#xff0c;都能悄然为您创造财富。 金贝 E-KA1M 5.5t是一款具有较强算力的静音挖kuang机&#xff0c;其…

SQLite 插入数据并返回自增ID

要插入数据并返回自增ID&#xff0c;我们可以使用SQLite的last_insert_rowid()函数。这个函数返回了最后一次插入操作的自增ID。 下面我们通过一个示例来演示如何插入数据并返回自增ID。 首先&#xff0c;创建一个表来存储学生信息&#xff1a; CREATE TABLE students (id I…

Django ORM使用

1.基本操作 1.1 添加 (1)save() 通过创建模型类对象,执行对象的save()方法保存到数据库中。 student = Student(name="测试",age=17,sex=True ) student.save() # 保存 print(student.id) # 判断是否新增有ID (2)create() 通过模型类.objects.create()保存…

DHU OJ 二维数组

思路及代码 #include<iostream> using namespace std; int main(){ //input 多组 //input M,N int 1< <20 //input M 行 N 列 数据 //initialize listint M, N;while (cin >> M >> N){int list[M][N];for (int i 0; i < M-1; i){for (int j 0; j…

Prompt——与AI连接的桥梁

哇塞&#xff0c;Prompt真是个神奇的东西呢&#xff01;&#x1f31f; 它就像是对机器小精灵的魔法咒语&#xff0c;用对了&#xff0c;它们就能变出令人惊喜的宝藏。&#x1f52e; 想象一下&#xff0c;Prompt就像是给机器人的小脑瓜里输入了一个“想法种子”&#xff0c;然后…

基于STM32的农业病虫害检测检测系统:OpenCV、MQTT、Flask框架、MySQL(代码示例)

一、项目概述 随着全球农业现代化的不断推进&#xff0c;智能农业监测系统应运而生。此项目旨在通过实时监测土壤湿度、温度等环境数据&#xff0c;结合作物生长状态的分析&#xff0c;提高农业生产效率和作物质量。通过引入STM32单片机、OpenCV图像处理技术和后端数据分析系统…

基于Django的停车场车辆出入管理系统,可识别车牌图片

研究背景 随着城市化进程的加快&#xff0c;车辆数量不断增加&#xff0c;停车场的管理成为一个日益重要的课题。传统的停车场管理系统依赖人工登记和监控&#xff0c;不仅效率低下&#xff0c;而且容易出现疏漏和错误&#xff0c;难以满足现代社会对停车场管理智能化、高效化…