C语言实现队列
程序员文章站
2022-03-10 19:55:08
...
1.概念
队列也是一种线性的数据结构,采用先进先出的方式来管理数据,存入(队尾)和取出(队首)在两个不同的端点进行,需要记录两个端点各自的位置
2.实现思路
队列是一种逻辑概念,可以使用顺序结构来实现(顺序队列),也可以使用链式结构来实现(链式队列)
顺序队列需要记录头和尾,一般的顺序队列的队列空间只能使用一次,为了重复使用队列空间,顺序队列会被设计为环形队列(循环队列)
环形队列理论上空和满都是队首和队尾重合,为了方便区分,强制定义当队尾在队首前一个位置时队列为满
链式队列可以用带尾结点的单链表来实现,以头结点作为队首,以尾结点作为队尾,入队相当于尾部插入,出队相当于头部删除
3.设计环形队列结构体
typedef int T;
//环形队列结构
typedef struct{
T data[N];//队列空间
int head,tail;//队首 队尾
}sequeue_t,*queuelist_t;
C语言实现
- 创建空队列
queuelist_t create_emptyqueue()
{
queuelist_t sq = (queuelist_t)malloc(sizeof(sequeue_t));
if(sq){
//初始化队首和队尾
sq->head = sq->tail = 0;
}
return sq;
}
- 判空/判满
//判空 0---非空 1---空
int is_empty(queuelist_t sq)
{
//队首队尾重合为空
return sq->head==sq->tail;
}
//判满
int is_full(queuelist_t sq)
{
//队尾在队首的前一个
//队首在队尾的下一个位置
return sq->head==(sq->tail+1)%N;
}
- 入队
void queue_push(queuelist_t sq,T dt)
{
//判满
if(is_full(sq)){
printf("queue is full!\n");
return;
}
//入队
sq->data[sq->tail] = dt;
//tail移动到下一个位置
sq->tail = (sq->tail+1)%N;
}
- 出队
T queue_pop(queuelist_t sq)
{
//判空
if(is_empty(sq)){
printf("sq is empty!\n");
return -EEMPTY;
}
//出队
T tmp = sq->data[sq->head];
//head移动到下一个位置
sq->head = (sq->head+1)%N;
return tmp;
}