系列文章目录
文章目录
队列
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、队列是什么?
队列是一种特殊的线性表,特点是FIFO,适合用链式结构实现。
二、队列的实现
1.定义数据类型
代码如下:
//自定义数据类型
typedef int QDataType;
//队列节点
typedef struct QueueNode
{
QDataType data;
struct QueueNode* next;
}QNODE;
//定义结构体
typedef struct Queue
{
QNODE* head;
QNODE* tail;
}QUEUE;
2.队列的各种接口
代码如下:
//接口
void QueueInit(QUEUE* pq);//初始化队列
void QueueDestroy(QUEUE* pq);//销毁队列
void QueuePush(QUEUE* pq,QDataType x);//入队
void QueuePop(QUEUE* pq);//出队
bool QueueEmpty(QUEUE* pq);//队列是否为空
int QueueSize(QUEUE* pq);//队列的长度
QDataType QueueFront(QUEUE* pq);//获取队头数据
QDataType QueueBack(QUEUE* pq);//获取队尾数据
3.初始化队列
代码如下:
void QueueInit(QUEUE* pq)
{
assert(pq);
pq->head = NULL;
pq->tail = NULL;
}
4.销毁队列
代码如下:
void QueueDestroy(QUEUE* pq)
{
assert(pq);
QNODE* cur = pq->head;
QNODE* tmp = NULL;
while (cur)
{
tmp = cur->next;
free(cur);
cur = tmp;
}
pq->head = NULL;
pq->tail = NULL;
}
5.入队
代码如下:
void QueuePush(QUEUE* pq, QDataType x)
{
//创建新节点,并初始化
QNODE* pNode = (QNODE*)malloc(sizeof(QNODE));
pNode->data = x;
pNode->next = NULL;
if (NULL == pq->head)
{
//链表为空,head tail指向新节点
pq->head = pNode;
pq->tail = pNode;
}
else
{
//链表不为空,在尾部插入
pq->tail->next = pNode;
//tail移动
pq->tail = pq->tail->next;
}
}
6.出队
代码如下:
void QueuePop(QUEUE* pq)
{
QNODE* tmp;
assert(pq);
if (QueueEmpty(pq))
{
printf("Queue is empty,pop fail!\n");
exit(-1);
}
else
{
tmp = pq->head;
pq->head = pq->head->next;
if (pq->head == NULL)
{
//把tail也置为NULL
pq->tail = NULL;
}
free(tmp);
}
}
7.队列是否为空
代码如下:
bool QueueEmpty(QUEUE* pq)
{
if (NULL == pq->head && NULL == pq->tail)
return true;
else
return false;
}
8.求队列长度
代码如下:
int QueueSize(QUEUE* pq)
{
QNODE* cur = pq->head;
int size = 1;
assert(pq);
if (QueueEmpty(pq))
{
return 0;
}
else
{
while (cur != pq->tail)
{
size++;
cur = cur->next;
}
return size;
}
}
9.获取队头数据
代码如下:
QDataType QueueFront(QUEUE* pq)
{
assert(pq);
if (QueueEmpty(pq))
{
printf("队列为空,获取队头数据失败!\n");
exit(-1);
}
return pq->head->data;
}
10.获取队尾数据
代码如下:
QDataType QueueBack(QUEUE* pq)
{
assert(pq);
if (QueueEmpty(pq))
{
printf("队列为空,获取队尾数据失败!\n");
exit(-1);
}
return pq->tail->data;
}
总结
记录自己实现的队列。