赞
踩
队列:(含详细图解): ( 创建,初始化,入队,出队,获取队中数据个数,获取队顶数据,注销队列)
栈:(含详细图解): (创建,初始化,入栈,出栈,获取栈中数据个数,获取栈顶数据,注销栈)
队列,简称队,是一种特殊的线性表。其特殊性在于,它只允许在表的一端(称为队尾)进行插入操作,而在表的另一端(称为队头)进行删除操作。这种“先进先出”(First In First Out,FIFO)的规则是队列的核心特性。具体来说,向队列中插入新的数据元素被称为"入队",新入队的元素就成为了队列的队尾元素。从队列中删除队头元素被称为"出队",其后继元素成为新的队头元素。
值得一提的是,队列作为一种线性表,也存在两种存储结构:顺序存储结构和链式存储结构。顺序队列通过一段连续的存储空间实现,而链式队列则通过链表实现。
- typedef int QDataType;
-
- typedef struct QueueNode {
- struct QueueNode* next;
- QDataType data;
- }QueueNode;
-
-
- typedef struct Queue {
- QueueNode* head;
- QueueNode* tail;
- }Queue;
- void QueueInit(Queue* pq)
- {
- assert(pq);
- pq->head = pq->tail = NULL;
- }
- void QueuePush(Queue* pq, QDataType x)
- {
- assert(pq);
- QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
- if (newnode == NULL)
- {
- printf("malloc fault\n");
- exit(-1);
- }
- newnode->data = x;
- newnode->next = NULL;
-
- if (pq->head == NULL)
- {
- pq->head = pq->tail = newnode;
- }
- else
- {
- pq->tail->next = newnode;
- pq->tail = newnode;
- }
-
- }
- void QueuePop(Queue* pq)
- {
- assert(pq);
- assert(pq->head);
- QueueNode* next = pq->head->next;
- free(pq->head);
- pq->head = next;
- if (pq->head == NULL)
- {
- pq->tail = NULL;
- }
- }
- void QueueDestory(Queue* pq)
- {
- assert(pq);
- QueueNode* cur = pq->head;
- while (cur)
- {
- QueueNode* next = cur->next;
- free(cur);
- cur = next;
- }
- pq->head = pq->tail = NULL;
- }
- QDataType QueueFront(Queue* pq)
- {
- assert(pq);
- assert(pq->head);
- return pq->head->data;
- }
- QDataType QueueBack(Queue* pq)
- {
- assert(pq);
- assert(pq->head);
- return pq->tail->data;
- }
- //返回1是空,返回0是非空
- int QueueEmpty(Queue* pq)
- {
- assert(pq);
- return pq->head == NULL ? 1 : 0;
- }
- int QueueSize(Queue* pq)
- {
- assert(pq);
- int size = 0;
- QueueNode* cur = pq->head;
- while (cur)
- {
- ++size;
- cur = cur->next;
- }
- return size;
- }
- #pragma once
- #include<stdio.h>
- #include<stdlib.h>
- #include<assert.h>
-
- typedef int QDataType;
- typedef struct QueueNode {
- struct QueueNode* next;
- QDataType data;
- }QueueNode;
-
- typedef struct Queue {
- QueueNode* head;
- QueueNode* tail;
- }Queue;
-
-
- void QueueInit(Queue* pq)
- {
- assert(pq);
- pq->head = pq->tail = NULL;
- }
-
-
-
- void QueueDestory(Queue* pq)
- {
- assert(pq);
- QueueNode* cur = pq->head;
- while (cur)
- {
- QueueNode* next = cur->next;
- free(cur);
- cur = next;
- }
- pq->head = pq->tail = NULL;
- }
-
-
-
- void QueuePush(Queue* pq, QDataType x)
- {
- assert(pq);
- QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
- if (newnode == NULL)
- {
- printf("malloc fault\n");
- exit(-1);
- }
- newnode->data = x;
- newnode->next = NULL;
-
- if (pq->head == NULL)
- {
- pq->head = pq->tail = newnode;
- }
- else
- {
- pq->tail->next = newnode;
- pq->tail = newnode;
- }
-
- }
-
-
- void QueuePop(Queue* pq)
- {
- assert(pq);
- assert(pq->head);
- QueueNode* next = pq->head->next;
- free(pq->head);
- pq->head = next;
- if (pq->head == NULL)
- {
- pq->tail = NULL;
- }
- }
-
-
-
- QDataType QueueFront(Queue* pq)
- {
- assert(pq);
- assert(pq->head);
- return pq->head->data;
- }
-
-
-
- QDataType QueueBack(Queue* pq)
- {
- assert(pq);
- assert(pq->head);
- return pq->tail->data;
- }
-
-
- //返回1是空,返回0是非空
- int QueueEmpty(Queue* pq)
- {
- assert(pq);
- return pq->head == NULL ? 1 : 0;
- }
-
-
- int QueueSize(Queue* pq)
- {
- assert(pq);
- int size = 0;
- QueueNode* cur = pq->head;
- while (cur)
- {
- ++size;
- cur = cur->next;
- }
- return size;
- }
-
-
-
-
- void PrintfQueue(Queue* pq)
- {
- QueueNode* cur = pq->head;
- if (pq->head == NULL)
- {
- printf("当前队列为空,没有节点\n");
- }
- else
- {
- while (cur)
- {
- printf("%d ", cur->data);
- cur = cur->next;
- }
- }
- printf("\n\n");
- }
-
-
-
- TestQueue()
- {
- Queue q;
- QueueInit(&q);
- QueuePush(&q, 1);
- QueuePush(&q, 7);
- QueuePush(&q, 3);
- QueuePush(&q, 9);
- QueuePush(&q, 2);
- QueuePush(&q, 3);
- QueuePush(&q, 6);
-
- printf("当前队列的全部节点为:\n");
- PrintfQueue(&q);
-
- printf("当前队头数据为:%d \n\n", QueueFront(&q));
- printf("当前队尾数据为:%d \n\n", QueueBack(&q));
-
-
- printf("出队3次:\n");
- QueuePop(&q);
- QueuePop(&q);
- QueuePop(&q);
- printf("当前队列的全部节点为:\n");
- PrintfQueue(&q);
-
- printf("插入3个节点\n");
- QueuePush(&q, 22);
- QueuePush(&q, 44);
- QueuePush(&q, 66);
- printf("当前队列的全部节点为:\n");
- PrintfQueue(&q);
-
-
- printf("全部出队\n");
- while (!QueueEmpty(&q))
- {
- printf("%d ", QueueFront(&q));
- QueuePop(&q);
- }
- printf("\n");
-
- printf("当前队列的全部节点为:\n");
- PrintfQueue(&q);
-
- QueueDestory(&q);
- }
- int main()
- {
- TestQueue();
- return 0;
- }
-
栈的细节内容在这里(下面的链接可以跳转过去)
栈的基础细节(c语言)(全部代码,详细图解):入栈,出栈,获取栈中数据个数,栈顶数据等
以上就是本期补齐的内容,欢迎参考指正,如有不懂,欢迎评论或私信出下期!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。