一、基本概念
队列是一种先进先出的线性数据结构,元素从队尾插入,从队头删除。队列的操作主要包括入队和出队
二、队列的实现方式
队列可以通过顺序表或链表实现。顺序表实现的队列需要处理循环队列的情况以避免空间浪费,链表实现的队列则更灵活。
1、顺序表实现循环队列
typedef int DATATYPE;
typedef struct queue {
DATATYPE *ptr;//动态分配的队列存储空间
int tlen;//队列总容量
int head;//队头指针
int tail;//队尾指针
}SeqQueue;//队列结构体定义
int DestroySeqQueue(SeqQueue *queue);//销毁队列
DATATYPE QuitSeqQueue(SeqQueue *queue);//出队
int EnterSeqQueue(SeqQueue *queue, DATATYPE data);//入队
int IsEmptySeqQueue(SeqQueue *queue);//队是否为空
int IsFullSeqQueue(SeqQueue *queue);//队是否为满
SeqQueue *CreateSeqQueue(int len);//创建指定容量的队
该代码实现了一循环顺序队列,通过头尾指针(head和tail)来管理队列操作。当head和tail相等时队列为空 ,当(tail+1)%tlen等于head时队列为满。这种实现方式可以高效利用数组空间,避免假溢出问题。
2、链表实现队列
c
// 定义人员信息结构体
typedef struct person {
char name[32]; // 姓名,最大32字符
char sex; // 性别
int age; // 年龄
int score; // 分数
} DATATYPE; // 数据类型别名
// 定义队列节点结构体
typedef struct quenode {
DATATYPE data; // 存储数据
struct quenode *next; // 指向下一个节点的指针
} LinkQueNode; // 链式队列节点类型别名
// 定义队列结构体
typedef struct {
LinkQueNode *head; // 队首指针
LinkQueNode *tail; // 队尾指针
int clen; // 当前队列长度
} LinkQue; // 链式队列类型别名
c
// 创建空链式队列
LinkQue * CreateLinkQue();
// 入队操作:将新节点添加到队尾
int EnterLinkQue(LinkQue *lq, DATATYPE* newnode);
// 出队操作:删除队首节点
int QuitLinkQue(LinkQue *lq);
// 获取队首元素(不删除)
DATATYPE* GetHeadLinkQue(LinkQue *lq);
// 获取队列当前长度
int GetSizeLinkQue(LinkQue *lq);
// 判断队列是否为空
int IsEmptyLinkQue(LinkQue *lq);
// 销毁队列
int DestroyLinkQue(LinkQue *lq);