有部分网站打不开,asp网站如何做伪静态,模板网站制作公司,如何建立自己音乐网站(꒪ꇴ꒪ )#xff0c;Hello我是祐言QAQ我的博客主页#xff1a;C/C语言,Linux基础,ARM开发板#xff0c;软件配置等领域博主#x1f30d;快上#x1f698;#xff0c;一起学习#xff0c;让我们成为一个强大的攻城狮#xff01;送给自己和读者的一句鸡汤#x1f914;Hello我是祐言QAQ我的博客主页C/C语言,Linux基础,ARM开发板软件配置等领域博主快上一起学习让我们成为一个强大的攻城狮送给自己和读者的一句鸡汤集中起来的意志可以击穿顽石!作者水平很有限如果发现错误可在评论区指正感谢 在我们的日常生活中队列是一个非常常见的现象。无论是在商店结账还是在公交站等车我们都在使用队列。在计算机科学中队列也是一个重要的数据结构用于处理和组织数据。在这篇文章中我们将详细探讨队列的定义、操作、以及如何用C语言实现队列。 一、队列的定义 队列Queue是一种特殊类型的线性数据结构它遵循特定的操作规则即遵循“先进先出”FIFOFirst-In-First-Out原则。这意味着在队列中首先加入的元素将会首先被移除最后加入的元素将会最后被移除。 当我们想存入1时先移动front队头然后再写入数据1拿数据也是一样但务必保证先移动rear队尾再拿出数据否则将会错位导致出错。 二、顺序队列 1. 队列结构体定义 首先需要定义一个顺序队列我们可以使用结构体来定义一个队列它包含一个数组用于存储队列的数据和三个整数用于表示队列长度、队首和队尾的位置。 typedef int Datatype;//队列的结构体定义
typedef struct Quene
{Datatype *q; //用来存放队列的数据int size; //队列的长度int front; //队头int rear; //队尾
}queue; 2. 初始化队列 接下来我们需要初始化队列。在初始化时我们将队首和队尾都设置为0表示队列为空。
//初始化一个队列
queue *init_queue(int size)
{queue *que malloc(sizeof(queue));if (que!NULL){que-q calloc(size, sizeof(Datatype));que-size size;que-front 0;que-rear 0;}return que;
} 3. 队空和队满 如果我们想要实现入队和出队操作我们需要先考虑队列可能会溢出或下溢的情况因此我们需要判断是否队空或队满。
//队空判断
bool isempty_queue(queue *q)
{return (q-rear q-front);
}//队满判断
bool isfull_queue(queue *q)
{return ((q-rear1)%q-size q-front);
} 4. 入队和出队
//入队
bool en_queue(queue *que, Datatype data)
{if (isfull_queue(que)){return false;}//先挪rearque-rear (que-rear1)%(que-size);//再入数据que-q[que-rear] data;return true;
}//出队
bool de_queue(queue *que, Datatype *data)
{if (isempty_queue(que)){return false;}//先挪frontque-front (que-front1)%(que-size);//再取数据*data que-q[que-front];return true;
} 队列是计算机科学中的一个基础概念它在许多场景中都有应用如操作系统的任务调度网络的数据包处理等。理解队列的工作原理并能够实现队列对于学习和理解计算机科学的其他概念是非常有帮助的。希望这篇文章能帮助你理解和实现队列。 下面是一个简单的顺序队列举例实现输入正整数添加员工信息入队用这个正整数表示员工号输入负整数出队队首显示该员工的所有信息否则就退出。 员工信息工号、姓名、工资 完整源码
#include stdio.h
#include stdlib.h
#include stdbool.h#define SIZE 1024
typedef struct people
{int number; //工号char name[20]; //姓名int money; //工资
}Datatype;//队列的结构体定义
typedef struct Quene
{Datatype *q; //用来存放队列的数据int size; //队列的长度int front; //队头int rear; //队尾
}queue;//初始化一个队列
queue *init_queue(int size)
{queue *que malloc(sizeof(queue));if (que!NULL){que-q calloc(size, sizeof(Datatype));que-size size;que-front 0;que-rear 0;}return que;
}//队空判断
bool isempty_queue(queue *q)
{return (q-rear q-front);
}//队满判断
bool isfull_queue(queue *q)
{return ((q-rear1)%q-size q-front);
}//入队
bool en_queue(queue *que, Datatype data)
{if (isfull_queue(que)){return false;}//先挪rearque-rear (que-rear1)%(que-size);//再入数据que-q[que-rear] data;return true;
}//出队
bool de_queue(queue *que, Datatype *data)
{if (isempty_queue(que)){return false;}//先挪frontque-front (que-front1)%(que-size);//再取数据*data que-q[que-front];return true;
}// 添加信息
void init_info(Datatype *data,int n)
{data-number n;printf(请输入工人信息\n);while(getchar() ! \n);printf(姓名);scanf(%s, data-name);printf(工资);scanf(%d, data-money);
}int main(int argc, char const *argv[]) {queue *q init_queue(SIZE);int n;Datatype data;while (1) {printf(请输入一个正整数或负数\n);scanf(%d, n);if (n 0){init_info(data, n);en_queue(q, data);continue;}else if(n 0){Datatype d;if (de_queue(q, d)) {printf(工号%d姓名%s工资%d\n, d.number, d.name, d.money);} else {printf(队列已空无法出队。\n);}}else{return -1;}}free(q-q);free(q);return 0;
} 三、链式队列 链式队列Linked Queue是一种使用链表来实现的队列数据结构。与顺序队列不同链式队列的元素并不直接存储在数组中而是通过链表节点来连接。 并且 由于使用链表实现链式队列的大小可以根据需要动态分配和释放内存避免了固定数组大小可能带来的限制。因此就没有是否队满问题。
1.结构体定义
typedef int Datatype;typedef struct Node
{Datatype data;struct Node *next;
}node;typedef struct List_queue
{node *rear; //队尾指针node *front; //队头指针int size; //链式队列的长度(实际的元素的个数)
}L_q;2.创建新节点和判断队空
//创建新节点
node *create_node(Datatype data)
{node *new malloc(sizeof(node));if (new ! NULL){new-data data;new-next NULL;}return new;
}
//链式队列是否为空
bool isempty_list_queue(L_q *q)
{return (q-size 0);
}
3.初始化队列
//初始化链式队列
L_q *init_list_queue()
{L_q *q malloc(sizeof(L_q));if (q!NULL){q-rear NULL;q-front NULL;q-size 0;}return q;
}
3.入队 入队操作在链表的末尾添加一个新节点同时更新队尾指针。
//入队
bool en_list_queue(L_q *q, Datatype data)
{//先要将数据创建新节点node *new create_node(data);if (newNULL){return false;}//如果是第一次入队new节点既是队尾也是队头if (isempty_list_queue(q)){q-rear new;q-front new;}else //不是第一次入队{//先将尾部节点的next指向new节点q-rear-next new;//尾部节点要变成新节点newq-rear new;}//队的元素个数要1q-size;return true;
}
4.出队 出队操作移除链表的第一个节点同时更新队头指针。
//出队
bool de_list_queue(L_q *q, Datatype *data)
{if (isempty_list_queue(q)){return false;}else if(q-size 1)//只有一个数据的时候{q-rear NULL;}//在链表不为空的情况下,先拿队头的数据*data q-front-data;//将队头指向下一个节点q-front q-front-next;//链式队列的元素个数-1q-size--;return true;
} 5.遍历
//遍历
void display(L_q *q)
{if (q-front NULL){return ;}node *p q-front;while(p-next ! NULL){printf(%d , p-data);p p-next;}printf(%d\n, p-data);
} 简单示例当我们输入正数时入队并遍历整个队列当我们输入负数时出队一个元素并再次遍历队列输入0时退出。 int main(int argc, char const *argv[])
{L_q *q init_list_queue();int num;Datatype data;while(1){scanf(%d, num);if(num 0){en_list_queue(q, num); display(q); }else if(num 0){de_list_queue(q, data);display(q); }else{break;}}return 0;
} 四、结语 队列作为一种基本的数据结构在我们的编程生涯中扮演着重要的角色。希望这篇文章提供了一个清晰、详细的队列概述帮助你理解队列的基本概念和操作以及如何用C语言实现队列。 选择顺序队列还是链式队列取决于实际应用的需求。如果你需要一个固定大小的队列可以考虑使用顺序队列。如果你希望队列大小能够根据需要进行动态调整那么链式队列更适合。在大多数情况下链式队列具有更好的扩展性和灵活性。 更多C语言、Linux系统、ARM板实战和数据结构相关文章关注专栏 手撕C语言 玩转linux 脚踢数据结构 6818ARM开发板实战
写在最后
今天的分享就到这啦~觉得博主写的还不错的烦劳 一键三连喔~感谢关注