【数据结构】队列的实现
创始人
2024-03-28 17:40:00
0

目录

  • 队列的概念
  • 队列的结构声明
  • 队列的初始化
  • 数据入队
  • 判断队列是否为空
  • 队列出数据
  • 获取队头
  • 获取队尾
  • 获取队列长度
  • 摧毁队列

队列的概念

只允许从一端插入数据,另一端出数据。
队头:出数据的一端叫队头。
队尾:入数据的一端叫队尾。
通俗地说,就是把栈的数据结构栈底给凿开了用来出数据。

入队演示
在这里插入图片描述

出队演示
在这里插入图片描述

队列的结构声明

我们知道队列有队头和队尾,队尾只添数据不删数据,队头只删数据不添数据。所以我们声明的时候可以用2个指针,一个指向队头,一个指向队尾。

typedef int QDataType;//队列的节点
struct QueueNode
{QDataType val;QueueNode* next;
};struct Queue
{//一个指针指向头QueueNode* head;//一个指针指向尾QueueNode* tail;
};

队列的初始化

队列初始时是没有值的,也就意味着没有节点,所以我们把它的头节点和尾节点都指向NULL。

//初始化
void QueueInto(Queue* q)
{assert(q);q->head = NULL;q->tail = NULL;
}

数据入队

数据入队,我们只需要让tail 指向 新节点,如果 head是空的话,也就是刚初始化状态,那么让head也指向这个节点。

如果head 和tail为空
在这里插入图片描述

如果不为空
在这里插入图片描述
代码


//创建节点
QueueNode* CreateNode(QDataType x)
{QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));if (newNode == NULL){printf("malloc faile\n");exit(-1);}newNode->next = NULL;newNode->val = x;return newNode;
}//数据入队
void QueuePush(Queue* q, QDataType x)
{//断言assert(q);//创建节点QueueNode* newNode = CreateNode(x);//如果head NULLif (q->head == NULL){q->head = newNode;q->tail = newNode;}else{//尾节点指向新节点q->tail->next = newNode;//尾节点移动位置q->tail = newNode;}}

判断队列是否为空

很简单,如果头节点为空了,那么整个队列自然就为空了。因为是从队头开始出数据,没有数据出了,那就空了。

//判断队列是否为空
bool QueueIsEmpty(Queue* q)
{return q->head == NULL;
}

队列出数据

出数据很简单,释放头节点,让头节点指向下一个,因为队列是先进先出,所以头节点是队头,从队头开始出数据。

在这里插入图片描述

代码


//数据出队
void QueuePop(Queue* q)
{assert(q);//要保证队列里有数据可以删除assert(!QueueIsEmpty(q));//头删QueueNode* next = q->head->next;free(q->head);q->head = next;
}

获取队头

只要队列不为空,就可以获取到队头,所以断言一下,直接获取队头即可。

//获取队头
QDataType QueueGetFront(Queue* q)
{assert(q);//要保证队列里有数据assert(!QueueIsEmpty(q));return q->head->val;
}

获取队尾

和队头一样,直接获取,不过要保证队列有数据

//获取队尾
QDataType QueueGetBack(Queue* q)
{assert(q);//要保证队列里有数据assert(!QueueIsEmpty(q));return q->tail->val;
}

在这里插入图片描述

获取队列长度

从头开始找到尾,返回长度即可。

//获取队列长度
size_t QueueGetSize(Queue* q)
{assert(q);//要保证队列里有数据assert(!QueueIsEmpty(q));int len = 1;QueueNode* head = q->head;QueueNode* tail = q -> tail;while (head != tail){len++;head = head->next;}return len;
}

摧毁队列

直接释放所有节点,指针置为NULL即可

//销毁
void QueueDestroy(Queue* q)
{QueueNode* cru = q->head;while (cru != NULL){//存储下一个位置地址QueueNode* next = cru->next;free(cru);cru = next;}	
}

以上代码Git链接

相关内容

热门资讯

无锡律师行业前景与老律师经验传... 在无锡、常州、苏州、镇江、南通等地,律师行业正展现出蓬勃的发展态势,无锡律师行业前景更是备受瞩目。随...
南京市廉政文化研究会应邀赴西安... 扬子晚报网12月28日讯(通讯员 杨雅舒 邵加宝 记者 闫春旭)12月28日,由陕西省廉政文化研究会...
北京放宽购房门槛,优化住房信贷...   为更好满足居民刚性和多样化改善性住房需求,北京进一步优化调整房地产相关政策。   12月24日,...
刘百奇:政策与市场双轮驱动——... 12月28日,由创业黑马主办的“第17届创业家年会”在北京举办,年会主题为“智业革命 —— 跨越断层...
原创 郑... 自从被曝与前夫张恒在国外合开代孕机构之后,郑爽突然又活跃了起来,舆论都过去了,以郑爽名义成立的几个账...
成都警方通报燃爆事件:段某因纠... 2025年12月28日,成都市公安局高新区分局发布警情通报: 来源:成都公安
原创 从... 古代传统婚姻讲究“聘则为妻,奔则为妾”,这句话出自《礼记.内则》,将妻和妾的关系区分的很明白。娶妻不...
成都警方:一男子因纠纷引发燃爆... 12月28日,成都市公安局高新区分局发布警情通报: 12月28日下午,我区南三环路四段一汽车销售服务...
高新区一4S店发生燃爆致1死4... 12月28日,成都市公安局高新公安分局发布警情通报称,2025年12月28日下午,高新区南三环路四段...
吉利起诉欣旺达索赔23亿,最“... 文 | 超聚焦 辛辛苦苦干两年,结果到头还赔钱。 12月26日,欣旺达发布公告称,子公司欣旺达动力...