前言
- 本节主要进行C语言数据结构队列的学习。

“Stay hungry,Stay foolish.” (求知若饥,虚心若愚。) ——史蒂夫·乔布斯
1.队列的介绍
- 队列是一种先进先出(First In First Out)的线性表,简称FIFO。
- FIFO,这同FPGA里数据缓冲器FIFOip的使用原理与功能类似,不过那是以“硬核”的形式存在的,其本质是一种存储设备,而在数据结构里是程序在内存中开辟区域,是内存里的空间。
- 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
- 允许插入的一端称为队尾,允许删除的一端称为队头。

- 队头(Front):允许删除的一端,又称队首。
- 队尾(Rear):允许插入的一端。
- 空队列:不包含任何元素的空表。
FIFO与buffer的区别:
- 1.FIFO可以说一块具体的硬件存储设备,也可以说程序在内存中开辟的一段内存区域。而buffer往往就是一段缓冲的数据区域
- 2.FIFO的数据是先进先出的,而buffer没有这个限制,可以全局访问
- 3.buffer往往就是一段累积的存储空间,而fifo有时候还可以帮助系统解决时钟域不同步或者数据宽度不一样的情况
- 链表实现队列过程:

2.单链表实现队列
- 实现内容与前章相同,1.初始化队列;2.入队;3.出队。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct Node//定义数据结构,包含数据域域next域
{
int data;//data域
struct Node* next;//next指针域
}Node;
Node* initList()//初始化头节点
{
Node* Queue=(Node*)malloc(sizeof(Node));//开辟空间,新建节点
Queue->data=0;//队列默认个数为0
Queue->next=NULL;//队列为空,故头节点next域指向空
return Queue;
}
bool isEmpty(Node* Queue)//检查队列是否为空
{
if(Queue->data==0||Queue->next==NULL) return 0;//为空返回0
else return 1;//不为空返回1
}
void enQueue(Node* Queue,int data)//入队
{
Node* Q=Queue;
Node* node = (Node*)malloc(sizeof(Node));//开辟空间,新建节点
node->data = data;//data给到新建节点的数据域
for(int i=0;i<Queue->data;i++)
{
Q=Q->next;
}
node->next=Q->next;//NULL
Q->next=node;
Queue->data++;//入队导致队元素个数加一
}
int deQueue(Node* Queue)//出队
{
if(isEmpty(Queue)==0) return -1;//队空,出队错误
else
{
Queue->data--;//出队导致队元素个数减一
Node* node=Queue->next;//新建结点存队头,用于调整队表顺序后释放使用
int n=Queue->next->data;//新建遍历存储队头,用于输出使用
Queue->next=Queue->next->next;//调整链表顺序,删除队头
free(node);//释放旧队头节点
return n;//出队
}
}
void printList(Node* Queue)//遍历操作
{
Node* node=Queue->next;//队头给到新建节点node,即头节点的下一个
while(node!=NULL)//未到队尾
{
printf("%d->",node->data);
node=node->next;
}
printf("NULL\n");
}
int main()
{
Node* Queue= initList();//初始化头节点,创捷队列
printf("%d\n",deQueue(Queue));
printList(Queue);
enQueue(Queue,1);
printList(Queue);
enQueue(Queue,2);
printList(Queue);
enQueue(Queue,3);
printList(Queue);
enQueue(Queue,4);
printList(Queue);
enQueue(Queue,5);
printList(Queue);
printf("%d\n",deQueue(Queue));
printList(Queue);
printf("%d\n",deQueue(Queue));
printList(Queue);
printf("%d\n",deQueue(Queue));
printList(Queue);
printf("%d\n",deQueue(Queue));
printList(Queue);
printf("%d\n",deQueue(Queue));
printList(Queue);
printf("%d\n",deQueue(Queue));
printList(Queue);
system("pause");
}

参考资料:
链接: UP从0到1带你手撕数据结构全集(C语言版)
本文介绍了如何使用C语言中的单链表来实现队列数据结构。包括队列的基本概念、初始化队列、入队和出队操作的具体实现。
1703

被折叠的 条评论
为什么被折叠?



