✨Blog:不会敲代码的小张:)
推荐专栏:C语言、Cpp️、数据结构初阶
座右铭:“記住,每一天都是一個新的開始”
本章内容:《队列》的介绍✨
队列,就是常用的数据结构之一。队列的特征是先进先出(First-In-First-Out),就相当于我们现实中排队的样子。
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,以及在表的后端(back)进行插入操作。和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
下面代码中用结构体把指针给封装了起来,方便后续使用。
如果不封装起来,后面函数传参的时候,会比较麻烦
typedef int QDatatype;
//队列节点
typedef struct QueueNode
{
struct QueueNode* next;
QDatatype data;
}QNode;
//我们这里用结构体把队列的指针封装起来
typedef struct Queue
{
QNode* head;//头指针
QNode* tail;//尾指针
int size;
}Queue;
最开始头指针尾指针都为空,size为0
void QueueInit(Queue* pq)
{
assert(pq);
pq->head = NULL;
pq->tail = NULL;
pq->size = 0;
}
创建一个cur指针指向队头,while循环,如果cur不为空就说明里面还有数据,保留cur下一个指针的位置,释放当前cur,然后再把刚刚保留的next指针给cur。
void QueueDestroy(Queue* pq)
{
assert(pq);
QNode* cur = pq->head;
while (cur)
{
QNode* next = cur->next;
free(cur);
cur = next;
}
pq->head = pq->tail = NULL;
pq->size = 0;
}
首先我们malloc一个空间,然后把要插入进去的数据放进data里,next掷为空,如果队头为空,那么就是一个空队列(队尾如果不是空就出问题了,所以断言一下),我们需要把newnode赋值给队头队尾,如果队头不为空,那么我们就只需要在队尾的位置插入,然后再更新队尾指针即可。
void QueuePush(Queue* pq, QDatatype x)
{
assert(pq);
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)
{
perror("malloc fail");
return;
}
newnode->data = x;
newnode->next = NULL;
if (pq->head == NULL)
{
assert(pq->tail == NULL);
pq->head = pq->tail = newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = newnode;
}
pq->size++;
}
既然是删除,那么队列里一定要有数据,所以要先断言,如果头指针和尾指针相等,说明队列只有一个元素,那么直接free即可,那么else我们需要先保留队头的指针,和队头下一个的指针位置,然后free掉队头元素,再把刚刚保留的next指针更新到对头。
void QueuePop(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
if (pq->head == pq->tail)
{
free(pq->head);
pq->head = NULL;
pq->tail = NULL;
}
else
{
QNode* del = pq->head;
QNode* next = pq->head->next;
free(del);
del = NULL;
pq->head = next;
}
pq->size--;
}
直接返回size
int QueueSize(Queue* pq)
{
assert(pq);
return pq->size;
}
用bool做为返回值,如果队头和队尾都为空,那么就是空队列。
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->head == NULL && pq->tail == NULL;
}
队列不能为空,然后直接返回队头指向的元素
QDatatype QueueFront(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->head->data;
}
队列不能为空,然后直接返回队尾指向的元素
QDatatype QueueBack(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->tail->data;
}