1.队列的基本结构
队列的特点为先进先出,属于线性结构,我们可以使用链表来实现。
队列
typedef int QDataType;
typedef struct QueueNode //链表
{
QDataType data;
struct QueueNode* next;
}QNode;
typedef struct Queue
{
QNode* head;
QNode* tail;
}Q;
2.队列的接口函数
初始化
void QueueInit(Q* pq);
void QueueInit(Q* pq)
{
assert(pq);
pq->head = NULL;
pq->tail = NULL;
}
销毁
void QueueDestory(Q* pq);
void QueueDestory(Q* pq)
{
assert(pq);
QNode* cur = pq -> head,* tmp;
while (cur != pq->tail&&cur)
{
tmp = cur->next;
free(cur);
cur = tmp;
}
pq->head = pq->tail = NULL;
}
队尾入
void QueuePush(Q* pq, QDataType x);
void QueuePush(Q* pq, QDataType x)
{
assert(pq);
QNode* new = (QNode*)malloc(sizeof(QNode));
if (new == NULL)
{
printf("malloc fail!");
exit(-1);
}
else
{
new->data = x, new->next = NULL;
if (pq->head == NULL)
{
pq->head = pq->tail = new;
}
else
{
pq->tail->next = new;
pq->tail = new;
}
}
}
队头出
void QueuePop(Q* pq);
void QueuePop(Q* pq)
{
assert(pq);
assert(pq->head);
if (pq->head == pq->tail)
{
printf("%d ", QueueFront(pq));
free(pq->head);
pq->head = pq->tail = NULL;
}
else
{
QNode* tmp = pq->head->next;
printf("%d ", QueueFront(pq));
free(pq->head);
pq->head = tmp;
}
}
队头
QDataType QueueFront(Q* pq);
QDataType QueueFront(Q* pq)
{
assert(pq);
assert(pq->head);
return pq->head->data;
}
队尾
QDataType QueueBack(Q* pq);
QDataType QueueBack(Q* pq)
{
assert(pq);
assert(pq->tail);
return pq->tail->data;
}
队列长度
int QueueSize(Q* pq);
int QueueSize(Q* pq)
{
assert(pq);
int i = 0;
QNode* cur = pq->head;
while (cur)
{
i++;
cur = cur->next;
}
return i;
}
队列是否为空
bool QueueEmpty(Q* pq);
bool QueueEmpty(Q* pq)
{
assert(pq);
return pq->head == NULL;
}
3.队列的使用
int main()
{
Q queue;
QueueInit(&queue);
QueuePush(&queue, 1);
QueuePush(&queue, 2);
QueuePush(&queue, 3);
printf("\n%d ", QueueSize(&queue));
QueuePop(&queue);
QueuePop(&queue);
QueuePop(&queue);
QueueDestory(&queue);
return 0;
}