需求:无
本篇文章将解决一下几个问题:
- 队列是什么?
- 如何实现一个队列?
- 什么场景下会用队列?
队列的概念:
- 队列:一种只允许一端进行插入数据操作,在另一端进行删除操作的特殊线性表。队列具有先进先出(FIFO)入队列:进行插入操作的一端称为队尾,出队列的一端叫做队头。
队列的实现:
- 队列也可以使用链表或者数组来实现。但是一般都是用链表来实现,如果用数组的话,出队列的时候,会移动数据,效率很低(O(N))。
- 用链表实现,出队列时要记录好头节点的下一个节点。
-
队列的判空:当元素个数为0,就是一个空队列,这时不允许出队列。
-
队列元素的个数:当入队列的时候,size就+1,出队列时就-1,当我们需要元素个数的时候就不需要遍历,用O(1)的时间复杂度就可以完成队列的元素个数。
队列的应用场景:
- 其实在我们的生活中,到处都是队列的身影,像排队买票的时候,医院叫号的时候....
- 还有就是想大麦app上抢演唱会的票等等,都有队列的身影。
队列的源码:
void QueueInit(Queue* pq)
{
assert(pq);
pq->tail = pq->head = NULL;
pq->size = 0;
}
void QueueDestroy(Queue* pq)
{
assert(pq);
QueueNode* cur = pq->head;
while (cur)
{
QueueNode* next = cur->next;
free(cur);
cur = next;
}
}
void QueuePush(Queue* pq, QueueDateType x)
{
assert(pq);
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
if (newnode == NULL)
{
perror("malloc fail");
exit(-1);
}
newnode->next = NULL;
newnode->val = x;
if (pq->head == NULL)
{
pq->tail = pq->head = newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = newnode;
}
pq->size++;
}
void QueuePop(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
if (pq->head->next == NULL)
{
free(pq->head);
pq->head = pq->tail = NULL;
pq->size--;
}
else
{
QueueNode* next = pq->head->next;
free(pq->head);
pq->head = next;
pq->size--;
}
}
QueueDateType QueueFront(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->head->val;
}
QueueDateType QueueBack(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->tail->val;
}
int QueueSize(Queue* pq)
{
assert(pq);
return pq->size;
}
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->head == NULL;
}
void QueuePrint(Queue* pq)
{
assert(pq);
while (pq->head)
{
printf("%d ", pq->head->val);
pq->head = pq->head->next;
}
printf("\n");
}
typedef int QueueDateType;
typedef struct QueueNode
{
struct QueueNode* next;
QueueDateType val;
}QueueNode;
typedef struct Queue
{
QueueNode* head;
QueueNode* tail;
int size;
}Queue;
void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
void QueuePush(Queue* pq,QueueDateType x);
void QueuePop(Queue* pq);
QueueDateType QueueFront(Queue* pq);
QueueDateType QueueBack(Queue* pq);
int QueueSize(Queue* pq);
bool QueueEmpty(Queue* pq);
void QueuePrint(Queue* pq);