admin管理员组文章数量:1794759
队列数据结构
队列
队列的概念及结构
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头
队列的实现
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
大概思路
代码语言:javascript代码运行次数:0运行复制// 链式结构:表示队列
typedef struct QListNode
{
struct QListNode* _pNext;
QDataType _data;
}QNode;
// 队列的结构
typedef struct Queue
{
QNode* _front;
QNode* _rear;
}Queue;
// 初始化队列
void QueueInit(Queue* q);
// 队尾入队列
void QueuePush(Queue* q, QDataType data);
// 队头出队列
void QueuePop(Queue* q);
// 获取队列头部元素
QDataType QueueFront(Queue* q);
// 获取队列队尾元素
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q);
// 销毁队列
void QueueDestroy(Queue* q);
代码
链式结构:表示队列
代码语言:javascript代码运行次数:0运行复制typedef char QDatatype;
typedef struct QueueNode
{
struct QueueNode* next;
QDatatype data;
}QNode
队列的结构
代码语言:javascript代码运行次数:0运行复制typedef struct Queue
{
QNode* head;
QNode* tail;
int size;
}Queue;;
代码语言:javascript代码运行次数:0运行复制void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
void QueuePush(Queue* pq, QDatatype x);
void QueuePop(Queue* pq);
int QueueSize(Queue* pq);
bool QueueEmpty(Queue* pq);
QDatatype QueueFront(Queue* pq);
QDatatype QueueBack(Queue* pq);
初始化
代码语言:javascript代码运行次数:0运行复制void QueueInit(Queue* pq);
代码语言:javascript代码运行次数:0运行复制void QueueInit(Queue* pq)
{
assert(pq);
pq->head= NULL;
pq->tail= NULL;
pq->size = 0;
}
销毁
代码语言:javascript代码运行次数:0运行复制void QueueDestroy(Queue* pq);
代码语言:javascript代码运行次数:0运行复制//销毁
void QueueDestroy(Queue* pq)
{
while (pq->head)
{
QNode* next = pq->head->next;
free(pq->head);
pq->head = next;
}
pq->head = pq->tail = NULL;
pq->size = 0;
}
插入,因为是先进先出,所以要尾插头出,想想单链表的结构
代码语言:javascript代码运行次数:0运行复制void QueuePush(Queue* pq, QDatatype x);
代码语言:javascript代码运行次数:0运行复制void QueuePush(Queue* pq, QDatatype x)
{
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)
{
perror("malloc fail");
return;
}
newnode->data = x;
newnode->next = NULL;
if (pq->head==NULL)
{
assert(pq->tail == NULL);
pq->head = pq->tail = newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = newnode;
}
pq->size++;
}
删除,就是出,先进先出,在链表中是头删
代码语言:javascript代码运行次数:0运行复制void QueuePop(Queue* pq);
代码语言:javascript代码运行次数:0运行复制void QueuePop(Queue* pq)
{
assert(pq);
assert(pq->head != NULL);
//只有一个时
if (pq->head->next == NULL)
{
free(pq->head);
pq->head = pq->tail = NULL;
}
else
{
QNode* next = pq->head->next;
free(pq->head);
pq->head = next;
}
pq->size--;
}
获取队列中有效元素个数
代码语言:javascript代码运行次数:0运行复制int QueueSize(Queue* pq);
代码语言:javascript代码运行次数:0运行复制int QueueSize(Queue* pq)
{
assert(pq);
return pq->size;
}
检测队列是否为空,如果为空返回非零结果,如果非空返回0
代码语言:javascript代码运行次数:0运行复制bool QueueEmpty(Queue* pq);
代码语言:javascript代码运行次数:0运行复制//法1
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
bool QueueEmpty(Queue* pq)
{
if (pq->size != 0)
{
return false;
}
else
return true;
}
代码语言:javascript代码运行次数:0运行复制//法二
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->size == 0;
}
获取队列头部元素
代码语言:javascript代码运行次数:0运行复制QDatatype QueueFront(Queue* pq);
代码语言:javascript代码运行次数:0运行复制QDatatype QueueFront(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->head->data;
}
获取队列队尾元素
代码语言:javascript代码运行次数:0运行复制QDatatype QueueBack(Queue* pq);
代码语言:javascript代码运行次数:0运行复制QDatatype QueueBack(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->tail->data;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-06-05,如有侵权请联系 cloudcommunity@tencent 删除队列链表数据数据结构queue本文标签: 队列数据结构
版权声明:本文标题:队列数据结构 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754739054a1705788.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论