理解队列
队列是一种特殊的先进先出的线性表,队列的操作只能在队头和队尾操作,即队尾插入数据,队头取数据。
队列的顺序存储
队列的顺序存储类似线性表的顺序存储
//SeqQueue.h
#pragma once
typedef void SeqQueue;
//创建队列
SeqQueue* SeqQueue_Create(int capacity);
//销毁队列
void SeqQueue_Destroy(SeqQueue* queue);
//清空队列
void SeqQueue_Clear(SeqQueue* queue);
//入队
int SeqQueue_Append(SeqQueue* queue, void* item);
//出队
void* SeqQueue_Retrieve(SeqQueue* queue);
//获取队头元素
void* SeqQueue_Header(SeqQueue* queue);
//获取队列大小
int SeqQueue_Size(SeqQueue* queue);
//获取队列容量
int SeqQueue_Capacity(SeqQueue* queue);
队列的链式存储
同样在元素入队列时需要给结点分配内存空间,在出队列时需要释放结点的内存。
//LinkQueue.h
#pragma once
typedef void LinkQueue;
//创建链队
LinkQueue* LinkQeueu_Create();
//销毁链队
void LinkQeueu_Destroy(LinkQueue* queue);
//清空链队
void LinkQeueu_Clear(LinkQueue* queue);
//元素入队
int LinkQeueu_Append(LinkQueue* queue, void* item);
//元素出队
void* LinkQeueu_Retrieve(LinkQueue* queue);
//获取队头元素
void* LinkQeueu_Header(LinkQueue* queue);
//获取队列大小
int LinkQeueu_Size(LinkQueue* queue);
#pragma warning(disable : 4996)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "LinkQueue.h"
#include "LinkList.h"
//队列结点
typedef struct tag_LinkQeueuNode
{
//队列结点包含链表结点
TLinkListNode node;
void* item;
}TLinkQueueNode;
//创建链队
LinkQueue* LinkQeueu_Create()
{
return (LinkQueue *)LinkList_Creat();
}
//销毁链队
void LinkQeueu_Destroy(LinkQueue* queue)
{
if (queue == NULL)
{
printf("LinkQeueu_Destroy err: queue = NULL");
return;
}
LinkQeueu_Clear(queue);
LinkList_Destroy(queue);
}
//清空链队
void LinkQeueu_Clear(LinkQueue* queue)
{
if (queue == NULL)
{
printf("LinkQeueu_Clear err: queue = NULL");
return;
}
while (LinkQeueu_Size(queue)>0)
{
LinkQeueu_Retrieve(queue);
}
}
//入队列
int LinkQeueu_Append(LinkQueue* queue, void* item)
{
TLinkQueueNode *temp = NULL;
int ret = 0;
if (queue == NULL || item == NULL)
{
ret = -1;
printf("LinkQeueu_Append err: queue = NULL || item = NULL");
return ret;
}
temp = (TLinkQueueNode *)malloc(sizeof(TLinkQueueNode));//分配内存空间
if (temp == NULL)
{
ret = -2;
printf("LinkQeueu_Append TLinkQueueNode malloc err:%d\n", ret);
return ret;
}
memset(temp, 0, sizeof(TLinkQueueNode));//结点初始化
temp->item = item;//保存结点信息
ret = LinkList_inster(queue, (TLinkListNode*)temp, 0);//入队列
if (ret != 0)//异常处理
{
if (temp != NULL)
free(temp);
}
return ret;
}
//出队列
void* LinkQeueu_Retrieve(LinkQueue* queue)
{
TLinkQueueNode *temp = NULL;
void *item = NULL;
if (queue == NULL)
{
printf("LinkQeueu_Retrieve err: queue = NULL");
return NULL;
}
temp = (TLinkQueueNode *)LinkList_Delete(queue, LinkList_GetLength(queue) - 1);//删除队尾元素
if (temp != NULL)
{
item = temp->item;
free(temp);//释放结点
}
return item;
}
//获取队头元素
void* LinkQeueu_Header(LinkQueue* queue)
{
TLinkQueueNode *temp = NULL;
void *item = NULL;
if (queue == NULL)
{
printf("LinkQeueu_Header err: queue = NULL");
return NULL;
}
temp = (TLinkQueueNode *)LinkList_Get(queue, LinkList_GetLength(queue) - 1);
if (temp != NULL)
{
item = temp->item;
}
return item;
}
//获取链队大小
int LinkQeueu_Size(LinkQueue* queue)
{
if (queue == NULL)
{
printf("LinkQeueu_Size err: queue = NULL");
return -1;
}
return LinkList_GetLength(queue);
}