编写代码过程中,涉及动态内存分配等常用的函数,需要引入如下头文件
#include<stdio.h>
#include<stdlib.h>
len 表示初始化时的数组长度,队列的最大容量为len-1
typedef struct Queue
{
int * pData; // 数据存放数组
int front; // 队头索引
int tail; // 队尾索引
int len; // 队列长度
} QUEUE;
void init(QUEUE * pQueue, int length); // 初始化
int isEmpty(QUEUE * pQueue); // 是否为空
int isFull(QUEUE * pQueue); // 是否已满
void enQueue(QUEUE * pQueue, int val); // 入队
void deQueue(QUEUE * pQueue, int *val); // 出队
void show(QUEUE * pQueue); // 列出所有元素
初始时队列的头尾的索引都是 0
void init(QUEUE * pQ, int len)
{
pQ->pData = (int *)malloc(sizeof(int ) * len);
if (pQ->pData == NULL)
{
printf("内存分配失败");
exit(-1);
}
pQ->front = 0;
pQ->tail = 0;
pQ->len = len;
}
int isEmpty(QUEUE * pQ)
{
if (pQ->front == pQ->tail)
{
return 1;
}
return 0;
}
循环队列需要取余操作
int isFull(QUEUE * pQ)
{
if ((pQ->tail + 1)%(pQ->len)==pQ->front)
{
return 1;
}
return 0;
}
void enQueue(QUEUE * pQ, int val)
{
if (isFull(pQ))
{
printf("队列已满");
return;
}
pQ->pData[pQ->tail] = val;
pQ->tail = (pQ->tail + 1) % (pQ->len);
}
void deQueue(QUEUE * pQ, int *val)
{
if (isEmpty(pQ))
{
printf("队列为空");
return;
}
*val = pQ->pData[pQ->front];
pQ->front = (pQ->front + 1)%(pQ->len);
}
front 的索引不一定比 tail 小,所以便利时 i 也要取余
void show(QUEUE * pQ)
{
if (isEmpty(pQ))
{
printf("队列为空");
return;
}
int i = pQ->front;
while ((i % pQ->len) != pQ->tail)
{
printf("%d,", pQ->pData[i]);
i++;
}
printf("\n");
}
int main()
{
int val;
QUEUE q;
init(&q, 5);
enQueue(&q, 1);
enQueue(&q, 2);
enQueue(&q, 3);
enQueue(&q, 4);
//enQueue(&q, 5);
show(&q);
deQueue(&q, &val);
deQueue(&q, &val);
show(&q);
enQueue(&q, 6);
enQueue(&q, 7);
show(&q);
return 0;
}
原文地址:https://www.cnblogs.com/sugare/p/13166965.html