文章目录
- 一、队列的结构和概念
- 二、队列的实现
- 三、队列的实现函数
- 四、队列的思维导图
一、队列的结构和概念
什么是队列?
队列就是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
如上图所示,第一个人先来,排在第一位就可以第一个走,也叫先进先出
但是想要近来就只能排队在后面等候
二、队列的实现
队列和栈一样都可以用链表和数组实现,但是对于队列来说,链表更好,因为用数组在对头出数据的话效率太低。
三、队列的实现函数
- 1.队列的初始化
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;}
- 2.队列的销毁
`
void QueueDestroy(Queue* pq)
{assert(pq);QueueNode* cur = pq->phead;while (cur){cur = pq->phead->next;free(pq->phead);pq->phead = cur;}pq->phead = pq->ptail = NULL;pq->size = 0;
}
链表的销毁需要一个一个节点的销毁,无法直接销毁
- 3.队列的判空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}
- 4.队列的插入
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){perror("malloc fail");return;}newnode->val = x;newnode->next = NULL;if (pq->ptail){pq->ptail->next= newnode;pq->ptail = newnode;}else{pq->phead = pq->ptail = newnode;}pq->size++;
}
每一个节点的开辟用malloc就行,这点与数组不一样,数组是realloc扩容
- 5.队列的删除
void QueuePop(Queue* pq)
{assert(pq);assert(pq->phead!=NULL);if (pq->phead->next == NULL){free(pq->phead);pq->phead = pq->ptail = NULL;}else{QueueNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;}
- 6.取队列的头
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;}
- 7.取队列的尾巴
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->ptail);return pq->ptail->val;
}
- 8.队列的长度
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
四、队列的思维导图
先赞后看,养成习惯!!!^ _ ^<3 ❤️ ❤️ ❤️
码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!
如有错误请您指正批评!