数据结构-队列详解

QUEUENode(队列的翻译)
队列:只允许在队里的一端插入和删除
FIFO:(first In first Out)
入队列的一端叫做队尾(也就是插入数据)
出队列的一端叫做队头(也就是删除数据)
由于队列的特殊插入和删除结构,即不论如何,出队列的数据总是连续的

数据结构-队列详解_第1张图片

队列可以使用数组或者是链表实现
数组实现:对头在数组初始位置开始,队尾在数组末尾
入队列比较简单,只需要对数组长度+1,加入数据即可


但是对于出队列来说,需要后面所有的数据往前挪动一个位置,效率比较低

数据结构-队列详解_第2张图片


也有人可能会这样的方式描述出队列: 
即直接将头的索引向后移动给一个位置,但是这会导致一个问题,即如果队列满了,那么前面的空间要不要?这是个问题

数据结构-队列详解_第3张图片

链表实现:
就是简单的单链表,头就是对头,尾就是队尾
入队列就是尾插,出队列就是头删

数据结构-队列详解_第4张图片

我们在书写代码时,脑海种有清晰的逻辑结构,那么在书写代码时,就能很好的对照相应功能进行实现。所以,要学会画图!

以下是队列的基本操作:

//定义队列节点
typedef struct QueueNode{
QDateType date;
struct QueueNode* next;

}QNode;

//由于队列有两个指针,可以在一起定义比较方便
typedef struct Queue{
struct QNode* head;
struct QNode* tail;
}Queue;

数据结构-队列详解_第5张图片

入队列:
入队列很简单,两种情况:
1、队列为空:
pead = pq->tail = newNode;
2、队列不为空,就是尾插:
pq->tail->natx = newNode;
pq->tail = newNode;

数据结构-队列详解_第6张图片


出队列:
很简单,就是头删
QNode* newHead = pq->head->next;
free(head);//释放之后,更新对头为newHeaad
pq->head = newHead;
//但是这存在一个问题,当队列只有一个时,释放完后,head会被赋予新值NULL
但是tail没动,但是其指向的空间已经free,此时tail就是野指针。
变成野指针之后,例如入队列,访问到pq->tail->next就是非法访问
画图,一目了然
所以,需要情况判断:
if(pq->head->next ==NULL){
free(pq->head);
pq->head=pq->tail = NULL;
}数据结构-队列详解_第7张图片


拿到对头:

拿到队尾:

数据结构-队列详解_第8张图片

简单的示例:

数据结构-队列详解_第9张图片


 

你可能感兴趣的:(C语言,数据结构,数据结构)