本章介绍的主要内容是数据结构中队列的概念,并通过代码实现链式结构的队列。
队列的基本概念:
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。
队列的特点:
- 队列是一种操作受限的线性表
- 队头(首):允许删除的一端
- 队尾:允许插入的一端
- 空队列:没有元素的队列
- 删除操作叫做
出队
,插入操作叫做入队
队列的实现:
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。
队列的代码实现:
队列的存储说明:
front指针:指向队头元素
rear指针:指向队尾元素的下一个位置
空队时:rear == front
队列初始化:rear = front = 0
入队:队未满时,先送值到队尾,再队尾指针加一
出队:队为空时,先取队头元素,再队头指针加一
队列的定义:
这里选择实现链表链式结构的队列:
- 链队本质上是一个同时带有队头指针、队尾指针的单链表
- 头指针指向队头结点
- 尾指针指向队尾结点
- 链式队列适合于数据元素变化较大的情形,不存在上溢
- 当使用多个队列时,最好使用链式队列,可以避免存储分配不合理下的溢出问题。
typedef int QDataType; typedef struct QueueNode //定义队列结点 { QDataType data; struct QueueNode* next; }QueueNode; typedef struct Queue //定义队列 { QueueNode* head; //队头 QueueNode* tail; //队尾 }Queue;
队列的初始化:
void QueueInit(Queue* pq) { assert(pq); pq->head = pq->tail = NULL; }
队列的判空操作:
只要头指针和尾指针没有指向任何空间就说明队列为空
bool Empty(Queue* ps) { assert(ps); return ps->head == NULL || ps->tail == NULL; }
队列的入队操作:
因为咱们是链式结构,无需检查队列是否满了,直接开辟一个新空间存储数据,向新结点的数据域赋值,然后tail->next
指向新结点。
void QueuePush(Queue* pq, QDataType val) { assert(pq); QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode)); if(newnode == NULL) { perror("fail"); exit(-1); } newnode->data = val; newnode->next = NULL; //检查队列是否为空 if(pq->head==NULL) pq->head=pq->tail=newnode; else { ps->tail->next=newnode; ps->tail=newnode; } }
队列的出队操作:
1.先判断是否是空队,保存下一个结点
2.free释放头结点
3.指向所保存的下一个结点
(上述过程要小心出现队列内元素全部清完,pq->tail变成野指针的情况)
void Pop(Queue* pq) { assert(pq); assert(!Empty(pq)); QNode* del = pq->head; pq->head = pq->head->next; free(del); del = NULL; if(pq->head==NULL||pq->tail==NULL) pq->head=pq->tail=NULL; }
队列的获取队首元素操作:
QDataType QueueFront(Queue* pq) { assert(pq); assert(!QueueEmpty(pq)); //不能为空 return pa->head->data; }
队列的获取队尾元素操作:
QDataType QueueBack(Queue* pq) { assert(pq); assert(!QueueEmpty(pq)); //不能为空 return pa->tail->data; }
队列元素个数:
size_t QueueSize(Queue* pq) { assert(pq); int num = 0; QueueNode* cur = pq->head; while(cur) { num++; cur = cur->next; } return num; }
队列的销毁:
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; }
数据结构的队列内容到此介绍结束了,感谢您的阅读!!!
如果内容对你有帮助的话,记得给我点个赞——做个手有余香的人。感谢大家的支持!!!