数据结构——队列(C语言)
温馨提示:这篇文章已超过406天没有更新,请注意相关的内容是否还可用!
需求:无
本篇文章将解决一下几个问题:
- 队列是什么?
- 如何实现一个队列?
- 什么场景下会用队列?
队列的概念:
- 队列:一种只允许一端进行插入数据操作,在另一端进行删除操作的特殊线性表。队列具有先进先出(FIFO)入队列:进行插入操作的一端称为队尾,出队列的一端叫做队头。
队列的实现:
- 队列也可以使用链表或者数组来实现。但是一般都是用链表来实现,如果用数组的话,出队列的时候,会移动数据,效率很低(O(N))。
- 用链表实现,出队列时要记录好头节点的下一个节点。
-
队列的判空:当元素个数为0,就是一个空队列,这时不允许出队列。
-
队列元素的个数:当入队列的时候,size就+1,出队列时就-1,当我们需要元素个数的时候就不需要遍历,用O(1)的时间复杂度就可以完成队列的元素个数。
队列的应用场景:
- 其实在我们的生活中,到处都是队列的身影,像排队买票的时候,医院叫号的时候....
- 还有就是想大麦app上抢演唱会的票等等,都有队列的身影。
队列的源码:
void QueueInit(Queue* pq) { assert(pq); pq->tail = pq->head = NULL; pq->size = 0; } void QueueDestroy(Queue* pq) { assert(pq); QueueNode* cur = pq->head; while (cur) { QueueNode* next = cur->next; free(cur); cur = next; } } void QueuePush(Queue* pq, QueueDateType x) { assert(pq); QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode)); if (newnode == NULL) { perror("malloc fail"); exit(-1); } newnode->next = NULL; newnode->val = x; if (pq->head == NULL) { pq->tail = pq->head = newnode; } else { pq->tail->next = newnode; pq->tail = newnode; } pq->size++; } void QueuePop(Queue* pq) { assert(pq); assert(!QueueEmpty(pq)); if (pq->head->next == NULL) { free(pq->head); pq->head = pq->tail = NULL; pq->size--; } else { QueueNode* next = pq->head->next; free(pq->head); pq->head = next; pq->size--; } } QueueDateType QueueFront(Queue* pq) { assert(pq); assert(!QueueEmpty(pq)); return pq->head->val; } QueueDateType QueueBack(Queue* pq) { assert(pq); assert(!QueueEmpty(pq)); return pq->tail->val; } int QueueSize(Queue* pq) { assert(pq); return pq->size; } bool QueueEmpty(Queue* pq) { assert(pq); return pq->head == NULL; } void QueuePrint(Queue* pq) { assert(pq); while (pq->head) { printf("%d ", pq->head->val); pq->head = pq->head->next; } printf("\n"); }typedef int QueueDateType; typedef struct QueueNode { struct QueueNode* next; QueueDateType val; }QueueNode; typedef struct Queue { QueueNode* head; QueueNode* tail; int size; }Queue; void QueueInit(Queue* pq); void QueueDestroy(Queue* pq); void QueuePush(Queue* pq,QueueDateType x); void QueuePop(Queue* pq); QueueDateType QueueFront(Queue* pq); QueueDateType QueueBack(Queue* pq); int QueueSize(Queue* pq); bool QueueEmpty(Queue* pq); void QueuePrint(Queue* pq);
-
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!



