数据结构(循环顺序队列)
在数据结构中,队列(Queue)是一种先进先出(FIFO)的线性结构。而循环顺序队列是对顺序队列的一种优化,可以避免因出队而造成空间浪费。
数据结构说明
定义顺序队列结构体 Sequqe
:
#define MAX_LEN 100 // 队列容量上限
typedef int DataType; // 可根据需要修改为其他类型typedef struct Sequqe {DataType *pbase; // 指向数据存储区域(数组)int phead; // 指向队头(第一个元素)int ptail; // 指向队尾(下一个可插入的位置)
} Sequqe;
完整代码实现
#include "seqquene.h"
#include <stdio.h>
#include <stdlib.h>// 创建队列
Sequqe *CreatSeqque() {Sequqe *seq = malloc(sizeof(Sequqe));if(NULL == seq) {printf("malloc seq error\n");return NULL;}seq->pbase = malloc(sizeof(DataType) * MAX_LEN);if(seq->pbase == NULL) {printf("malloc pbase error\n");return NULL;}seq->phead = 0;seq->ptail = 0;return seq;
}// 入队
int PushSeqquene(Sequqe *seq, DataType data) {if(IsFull(seq)) {printf("Is Full\n");return -1;}seq->pbase[seq->ptail] = data;seq->ptail = (seq->ptail + 1) % MAX_LEN;return 0;
}// 出队
int PopSeqquene(Sequqe *seq, DataType *deldata) {if(IsEmpty(seq)) {printf("Is Empty\n");return -1;}if(deldata) {*deldata = seq->pbase[seq->phead];}seq->phead = (seq->phead + 1) % MAX_LEN;return 0;
}// 打印队列所有元素
int ShowSeqquene(Sequqe *seq) {if(IsEmpty(seq)) {printf("Is Empty\n");return -1;}int i;for(i = seq->phead; i != seq->ptail; i = (i + 1) % MAX_LEN) {printf("%d ", seq->pbase[i]);}puts("");return 0;
}// 获取队头元素
int GetTop(Sequqe *seq, DataType *topdata) {if(IsEmpty(seq) || NULL == topdata) {printf("Is Empty\n");return -1;}*topdata = seq->pbase[seq->phead];return 0;
}// 销毁队列,释放内存
int DestroySeqquene(Sequqe **seq) {free((*seq)->pbase);free(*seq);*seq = NULL;return 0;
}// 判断是否队满(循环条件)
int IsFull(Sequqe *seq) {return (seq->ptail + 1) % MAX_LEN == seq->phead;
}// 判断是否队空
int IsEmpty(Sequqe *seq) {return seq->phead == seq->ptail;
}
代码核心逻辑解析
函数名 | 功能说明 |
---|---|
CreatSeqque | 创建队列,初始化数组与头尾指针 |
PushSeqquene | 入队:在尾部插入元素,尾指针循环前进 |
PopSeqquene | 出队:从头部取出元素,头指针循环前进 |
IsFull | 判断队列是否已满(尾指针的下一个是头指针) |
IsEmpty | 判断队列是否为空(头尾指针相等) |
GetTop | 查看队头元素但不出队 |
ShowSeqquene | 打印所有元素,循环方式遍历 |
DestroySeqquene | 销毁队列并释放内存资源 |
示例测试代码(main函数)
int main() {Sequqe *q = CreatSeqque();PushSeqquene(q, 10);PushSeqquene(q, 20);PushSeqquene(q, 30);ShowSeqquene(q); // 输出:10 20 30int val;PopSeqquene(q, &val);printf("Popped: %d\n", val); // 输出:10GetTop(q, &val);printf("Top: %d\n", val); // 输出:20ShowSeqquene(q); // 输出:20 30DestroySeqquene(&q);return 0;
}
优点和应用场景
优点:
- 使用循环数组实现,不会浪费空间
- 插入和删除操作时间复杂度 O(1)
- 结构简单、效率高
适用场景:
- 任务调度
- IO 缓冲区
- 数据流处理
- 有限资源排队系统(如打印机任务、客户排队等)