C语言数据结构:队列的操作实现
队列是一种常见的数据结构,遵循先进先出(FIFO)原则,即最先进入的元素最先被移除。它类似于现实生活中的排队,先到的人先接受服务。
主要操作
-
入队(Enqueue):将元素添加到队列的末尾。
-
出队(Dequeue):移除并返回队列前端的元素。
-
查看队首(Peek/Front):返回队列前端的元素,但不移除。
-
判空(IsEmpty):检查队列是否为空。
-
获取大小(Size):返回队列中元素的数量。
实现方式
-
数组实现:使用数组存储元素,需处理数组大小限制。
-
链表实现:使用链表动态调整大小,避免数组大小问题。
应用场景
-
任务调度:操作系统中的任务调度。
-
数据缓冲:网络数据包的缓冲。
-
广度优先搜索(BFS):用于遍历图或树结构。
#include <stdio.h>
#include <stdlib.h>
#define Max_Size 20
typedef int Elemtype;
typedef struct Queue
{
Elemtype Data[Max_Size];
int front;
int rear;
} Queue;
void Q_Init(Queue *q); // 队列初始化
int isEmpty(Queue *q); // 判断队列是否为空
Elemtype delQueue(Queue *q); // 出队
int in_Queue(Queue *q, Elemtype e); // 入队
int fullQueue(Queue *q); // 判断是否真的满了
void showQueue(Queue *q); // 遍历队列
int queueSize(Queue *q); // 得到队列里元素数量
int getHead(Queue *Q,Elemtype *e);
int main(int argc, char const *argv[])
{
Queue *q = malloc(sizeof(Queue));
Q_Init(q);
in_Queue(q, 1);
in_Queue(q, 2);
in_Queue(q, 3);
// printf("%d",q->Data[2]);
showQueue(q);
int size=0;
size = queueSize(q);
printf("%d",size);
return 0;
}
void Q_Init(Queue *q)
{
q->front = 0;//队头下标初始化
q->rear = 0;//队尾下标初始化
}
int isEmpty(Queue *q)
{
if (q->front == q->rear)//队头与队尾下标相同时为空
{
printf("队列为空\n");
return 1;
}
else
{
return 0;
}
}
Elemtype delQueue(Queue *q)
{
if (q->front == q->rear)
{
printf("队列为空\n");
return 1;
}
Elemtype e;//临时变量
e = q->Data[q->front];//临时变量承接删除元素
q->front++;//队头后移
return e;//返回删除元素
}
int in_Queue(Queue *q, Elemtype e)
{
if (q->rear >= Max_Size)//检查是否对满
{
if (!fullQueue(q))
{
printf("经FULL函数检测已满\n");
}
return 1;
}
q->Data[q->rear] = e;//队尾处新元素赋值
q->rear++;//队尾后移
return 0;
}
int fullQueue(Queue *q)
{
int step = 0;
if (q->front > 0)//队头不为零,则是假溢出
{
step = q->front;//队头后移次数
for (int i = q->front; i < q->rear; i++)//将队列内所有元素前移 step 步
{
q->Data[i - step] = q->Data[i];
}
q->front = 0;//队头更新
q->rear = q->rear - step;//队尾更新
}
else
{
//printf("经FULL函数检测已满\n");
return 0;
}
}
void showQueue(Queue *q)
{
printf("---------------\n");
for (int i = q->front; i < q->rear; i++)//循环从队头打印到队尾前一个元素
{
printf("%d ",q->Data[i]);
}
printf("\n");
printf("---------------\n");
}
int getHead(Queue *Q,Elemtype *e)
{
if (Q->front == Q->rear)
{
printf("队列为空\n");
return 1;
}
*e=Q->Data[Q->front];//指针指向队头
return 0;
}
int queueSize(Queue *q)
{
if (isEmpty(q))
{
return 0;
}
int temp=0;
temp=q->front;
int t=0;
while (temp!=q->rear)//从队头开始自增直到队尾
{
temp++;
t++;
}
return t;
}