1.队列的特点:
队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:
- 队列中的数据元素遵循“先进先出”(First In First Out)的原则。
- 在队尾添加元素,在队头删除元素。
2.队列操作:
- 队列初始化(QueueInit)
- 入队(QueuePush)
- 出队(QueuePop)
- 获取队首元素(QueueFront)
- 求队列元素的个数(QueueSize)
- 判断队列是否为空(QueueEmpty)
3.队列的存储结构:
队列与栈一样是一种线性结构,因此以常见的线性表如数组、链表作为底层的数据结构。
本文中,我们以链表为底层数据结构构建队列。
3.队列的代码:
1.Queue.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int QDataType;
typedef struct QNode{
QDataType data;
struct QNode *pNext;
}QNode;
typedef struct Queue{
QNode *pFront;
QNode *pRear;
int size;
}Queue;
2.Queue.c
#include "Queue.h"
//队列初始化
void QueueInit(Queue *pq)
{
assert(pq);
pq->pFront = pq->pRear = NULL;
pq->size = 0;
}
//入队
void QueuePush(Queue *pq, QDataType data)
{
assert(pq);
pq->size++;
QNode *QNewNode = (QNode*)malloc(sizeof(QNode));
QNewNode->data = data;
QNewNode->pNext = NULL;
//空链表的情况
if (pq->pRear == NULL){
pq->pFront = pq->pRear = QNewNode;
return;
}
//一般情况
pq->pRear->pNext = QNewNode;
pq->pRear = QNewNode;
}
//出队
void QueuePop(Queue *pq)
{
assert(pq);
assert(pq->size > 0);
pq->size--;
QNode *pOldFront = pq->pFront;
pq->pFront = pq->pFront->pNext;
free(pOldFront);
if (pq->pFront == NULL)
{
pq->pRear = NULL;
}
}
//获取队首元素
void QueueFront(Queue *pq)
{
assert(pq);
assert(pq->size > 0);
return(pq->pFront->data);
}
//判断队列是否为空
//1为空,0为不空
void QueueEmpty(Queue *pq)
{
return pq->size == 0 ? 1 : 0;
}
//求队列中元素个数
void QueueSize(Queue *pq)
{
return pq->size;
}