队列:一种先进先出的数据结构,在队尾插入数据,在队头弹出数据
下面详细介绍队列的顺序存储和链式存储实现:
顺序存储
//顺序队列结构体
typedef struct SEQQUEUE {
void* data[MAX_SIZE];
int size;
}SeqQueue;
//初始化队列
SeqQueue* init_SeqQueue() {
SeqQueue* queue = (SeqQueue*)malloc(sizeof(SeqQueue));
for (int i = 0; i < MAX_SIZE; i++)
{
queue->data[i] = NULL;
}
queue->size = 0;
return queue;
}
//入队列
void push_SeqQueue(SeqQueue* queue, void *data)
{
if (!queue || !data)
{
return;
}
if (queue->size == MAX_SIZE)
{
return;
}
queue->data[queue->size] = data;
queue->size++;
}
//返回队列头元素
void* front_SeqQueue(SeqQueue* queue)
{
if (!queue)
{
return NULL;
}
if (queue->size == 0)
{
return NULL;
}
return queue->data[0];
}
//返回队列尾元素
void* back_SeqQueue(SeqQueue* queue)
{
if (!queue)
{
return NULL;
}
if (queue->size == 0)
{
return NULL;
}
return queue->data[queue->size - 1];
}
//出队列
void pop_SeqQueue(SeqQueue* queue)
{
if (!queue)
{
return ;
}
if (queue->size == 0)
{
return;
}
for (int i = 0; i < queue->size - 1; i++)
{
queue->data[i] = queue->data[i + 1];
}
queue->size--;
}
下面是测试代码:
typedef struct PERSON {
int age;
char name[64];
}Person;
void seqQueueTest()
{
Person p1, p2, p3, p4;
p1.age = 10;
p2.age = 20;
p3.age = 30;
p4.age = 40;
SeqQueue* queue = init_SeqQueue();
push_SeqQueue(queue,&p1);
push_SeqQueue(queue, &p2);
push_SeqQueue(queue, &p3);
push_SeqQueue(queue, &p4);
while (queue->size > 0)
{
//返回队列头元素
Person* person =(Person*)front_SeqQueue(queue);
printf("front person age=%d\n", person->age);
person = (Person*)back_SeqQueue(queue);
printf("back person age=%d\n", person->age);
//出队列
pop_SeqQueue(queue);
}
}
链式存储
//链表结点定义
typedef struct LINKNODE {
struct LINKNODE* next;
}LinkNode;
//链式存储队列
typedef struct LINKQUEUE {
LinkNode head;
int size;
}LinkQueue;
//初始化队列
LinkQueue* init_LinkQueue()
{
LinkQueue* queue = (LinkQueue*)malloc(sizeof(LinkQueue));
queue->head.next = NULL;
queue->size = 0;
return queue;
}
//队尾入队列
void push_LinkQueue(LinkQueue* queue, LinkNode* data)
{
if (!queue || !data)
{
return;
}
if (queue->size == 0)
{
data->next = NULL;
queue->head.next = data;
queue->size++;
return;
}
LinkNode* pNext = queue->head.next;
for (int i = 0; i < queue->size - 1; i++)
{
pNext = pNext->next;
}
data->next = NULL;
pNext->next = data;
queue->size++;
}
//返回队列头元素
LinkNode* front_LinkQueue(LinkQueue* queue)
{
if (!queue) {
return NULL;
}
if (queue->size == 0)
{
return NULL;
}
return queue->head.next;
}
//返回队列尾元素
LinkNode* back_LinkQueue(LinkQueue* queue)
{
if (!queue) {
return NULL;
}
if (queue->size == 0)
{
return NULL;
}
LinkNode* pNext = queue->head.next;
for (int i = 0; i < queue->size - 1; i++)
{
pNext = pNext->next;
}
return pNext;
}
void pop_LinkQueue(LinkQueue* queue)
{
if (!queue) {
return;
}
if (queue->size == 0)
{
return;
}
queue->head.next = queue->head.next->next;
queue->size--;
}
下面是测试代码
typedef struct PERSONQUEUE {
LinkNode head;
int age;
char name[64];
}PersonQueue;
void linkQueueTest()
{
LinkQueue* queue = init_LinkQueue();
PersonQueue p1, p2, p3;
strcpy(p1.name, "p1");
strcpy(p2.name, "p2");
strcpy(p3.name, "p3");
p1.age = 10;
p2.age = 20;
p3.age = 30;
push_LinkQueue(queue, (LinkNode*)&p1);
push_LinkQueue(queue, (LinkNode*)&p2);
push_LinkQueue(queue, (LinkNode*)&p3);
PersonQueue* p=(PersonQueue*)back_LinkQueue(queue);
printf("queue back data name=%s, and age=%d\n",p->name, p->age);
while (queue->size > 0)
{
PersonQueue* p = (PersonQueue*)front_LinkQueue(queue);
printf("queue front data name=%s, and age=%d\n", p->name, p->age);
pop_LinkQueue(queue);
}
}