目录
一、队列的定义
二、队列的实现
1.使用链表来实现队列
2.实现队列的接口
初始化队列 void QueueInit(Queue *pq)
队尾入队列 void QueuePush(Queue *pq,QDataType data)
队头出队列 void QueuePop(Queue *pq)
获取队列头部元素 QDataType QueueFront(Queue *pq)
获取队列尾部元素 QDataType QueueBack(Queue *pq)
获取队列中的有效元素个数 int QueueSize(Queue *pq)
检测队列是否为空,bool QueueEmpty(Queue *q)
销毁队列 void QueueDestroy(Queue *q)
总结
提示:以下是本篇文章正文内容,下面案例可供参考
一、队列的定义
队列:只允许在一端进行插入,另外一端进行删除数据的特殊线性表,队列具有先进先出
入队列:在进行插入操作的一端称为队尾
出队列:在进行删除操作的一端称为队头
二、队列的实现
队列可以使用数组和链表实现,使用数组的结构时,出队列在数据头上出数据,效率低
1.使用链表来实现队列
typedef int QDataType;
//链式结构,表示队列
typedef struct QueueNode
{
struct QueueNode * next;
QDataType data;
}QNode;
//队列的结构
typedef struct Queue
{
QNode * head;
QNode * tail;
int size;
}Queue;
2.实现队列的接口
初始化队列 void QueueInit(Queue *pq)
void QueueInit(Queue *pq)
{
assert(pq);
pq->head=NULL;
pq->tail=NULL;
pq->size = 0;
}
队尾入队列 void QueuePush(Queue *pq,QDataType data)
void QueuePush(Queue *pq,QDataType x)
{
assert(pq);
//插入节点,自己构造一个新节点
QNode * newnode =(QNode *)malloc(sizeof(QNode));
if(newnode ==NULL)
{
perror("error");
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
//要考虑是否为空队列
if(pq->tail ==NULL)
{
pq->head = pq->tail = newnode;
}
else
{
//尾插
pq->tail->next = newnode;
pq->tail = newnode;
}
pq->size++;
}
队头出队列 void QueuePop(Queue *pq)
void QueuePop(Queue *pq)
{
assert(pq);
assert(!QueueEmpty(pq));
//特殊情况,要考虑只有一个节点,释放之后,head指向空,tail为野指针
if(pq->head->next ==NULL)
{
free(pq->head);
pq->head = pq->tail = NULL;
}
//保存当前节点,head指向下一个,释放当前节点
else
{
QNode * del = pq->head;
pq->head = pq->head->next;
free(del);
}
pq->size--;
}
获取队列头部元素 QDataType QueueFront(Queue *pq)
QDataType QueueFront(Queue *pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->head->data;
}
获取队列尾部元素 QDataType QueueBack(Queue *pq)
QDataType QueueBack(Queue *pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->tail->data;
}
获取队列中的有效元素个数 int QueueSize(Queue *pq)
如果使用遍历,size++的方式,时间复杂度为O(n);如果使用全局变量size来计算个数,会在有多个队列的时候容易混乱。所以在定义队列的时候,增加一个size变量,插入的时候size++,删除的时候size--,计算个数的时候可以直接返回size的大小,此时时间复杂度为O(1)
int QueueSize(Queue* pq)
{
assert(pq);
return pq->size;
}
检测队列是否为空,bool QueueEmpty(Queue *q)
如果为空返回非0结果,如果不为空返回0
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->head == NULL && pq->tail == NULL;
}
销毁队列 void QueueDestroy(Queue *q)
void QueueDestroy(Queue *q)
{
QNode * cur = pq->head;
while(cur !=NULL)
{
QNode * cur = pq->head;
while(cur!=NULL)
{
QNode * del = cur;
cur = cur->next;
free(del);
}
//删除完了之后,head和tail为野指针,所以需要置空
pq->head = pq->tail = NULL;
}
总结
本文主要记录了用链表实现队列,以及对队列的增删改查,技术有限,如有错误请指正。