队列概念(队列)、节点创建和初始化以及示例 C 代码
1。队列概念
在开始之前,请考虑这句话:队列是先进先出的数据结构。
队列是一种仅限于在表的一端插入和在表的另一端删除的数据结构。和学习栈一样,参考上一篇文章中学习的链表。想象一个单链表。我们只能修改它的链表。插入是在链表的末尾完成的,但只能从链表的头部删除节点。不允许所有其他操作。这种高度限制性的“链表”称为队列。
我们重新整理一下定义:队列是一种线性数据结构,规定这种数据结构只允许一端插入,另一端允许删除。禁止直接访问除这两端之外的所有数据。
![]()
如图:队列就像两端相连的水管。只允许一端插入,另一端拔出。首先插入管中的球首先从管中取出。
2。队列节点设计与初始化
队列不像栈那么方便模拟,所以队列只有链式调度方式,但不同的是队列本身被分成了若干个队列,比如顺序队列(queues,在本文)和循环队列(下一篇讨论),以及后面C++STL章节会提到的优先级队列等,都是从队列派生出来的。
以顺序队列设计为例。
首先是队列节点的设计。我们可以设计两种结构。一个结构节点代表一个包含数据字段和next指针的节点(可以看到我们重复了这种节点设计,我读了很多遍,正是因为这种结构设计很容易理解)。
(图像表示节点)
其中 data 表示可以是简单类型(例如 int、double 等)或复杂结构(struct 类型)的数据。
next指针表示指向下一个节点的next指针,各个节点通过next指针连接起来。
就像堆栈一样,我们重塑结构以进行限制性设计。接下来,我们添加一个附加结构,其中包含两个始终指向队列尾部和头部的指针。我们的主要操作就是为了这个两个指针的工作。
(图中为队列设计)
结构设计代码可表示为:
//节点定义 typedef struct 节点 { int 数据; 结构 节点 *下一个; }node;//队列定义,队列管理器类型指针和队列尾指针 typedef struct queue{ node *front; //头指针 节点 *back ; //尾指针}队列; |
至于初始化,稍微复杂一点,我们需要初始化两个队列进行初始化,一个是初始化节点,一个是初始化队列,初始化队列稍微复杂一点。不同的是,队列初始化时,头节点和尾节点指向的内容必须为空,表示队列为空。生成的两个函数代码可以表示为:
//初始化节点node *init_node(){ node *n=(node*)malloc( ) 尺寸(节点)); ( sizeof(queue)); if(q==NULL){ //创建失败,退出 退出 (0 ) ) q->后=NULL; 返回q;} |
3。判断队列是否为空
判断队列是否为空比较简单,只需判断队列头指针是否为空(涉及如何创建队列可以更好理解),判断,队列是否为空正常操作
代码可以表示为:
//队列为空int empty(queue *q){ if (k - >front==NULL){ 返回 1; //1-表示true,表示队列不为空 }else{ return |
或者直接使用返回值更容易判断(两种效果完全一样)
int 空(队列*q){ return q->front==NULL; } |
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网