我个人把链表、队列、栈分为一类,然后图、树分为一类。(串不考虑),分类的理由就是每一类有规律可循,即你能通过修改极少数的代码把链表变成队列、栈。...(这里我们不考虑其他诸如设计模式等因素),因此本贴在讲完队列之后还会归纳一下这一类数据结构的规律,帮助大家更好理解数据结构 首先需要知道队列是什么,这里给一个定义:队列是只允许一段进行插入操作,一段进行删除操作的线性表...,队列是先进先出的结构,允许插入成为队尾,允许删除成为队头 如上图就是一个队列,这里我相信你已经对队列有了一个概念了吧,于是就可以继续看下面了 队列同样存在插入删除操作,由于我们这里讨论的是链式队列的实现...我们能很容易写出下面插入节点到队列的代码(如果不能你就要发反思是否认真学习了): void en_queue(struct queue *q,char c){ struct node *e=new...n){ return; } e->data=c; e->next=NULL; if(q->rear==NULL){ q->front=q->rear
个人主页: :✨✨✨初阶牛✨✨✨ 推荐专栏: C语言进阶 个人信条: 知行合一 本篇简介:>:分享数据结构之C语言实现"队列".各个接口分别分析,讲解思路已经动图讲解....✨ 入队列:进行"插入"操作的一端称为队尾 出队列:进行"删除"操作的一端称为队头 用顺序表还是用链表实现队列比较好呢?...链表不需要扩容,顺序表需要动态扩容/ 综上,咱还是选择链表=实现队列吧!...(Queue* pq); 二、接口的具体实现: 2.1 "队列"的"初始化"操作(QueueInit) 队列的结构是由两个结点指针,加一个记录长度的size变量组成....(Queue.c): #include "Queue.h" //队列的初始化操作 void QueueInit(Queue* pq) { assert(pq); pq->head = NULL;
; // 队列头下标 int rear; // 队列尾下标 }*Queue; 顺序队列和顺序栈相类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外...为了在C语言中描述方便起见,初始化建空队列时,令 front = rear = 0; 每当插入新的队尾元素时 “尾指针增1”;每当删除队头元素时 “头指针增1”。...因此,在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置。...} return q -> front == q -> rear; } 计算顺序队列的长度 /* * 求顺序队列的长度(元素个数) * q 顺序队列 */ int QueueLength...用 循环队列 就可以解决假溢出情况。 源代码 源代码已上传到 GitHub Data-Structure-of-C,欢迎大家下载 C语言实现数据结构
文章目录 顺序队列的假溢出 解决上溢的方法 引入循环队列 循环队列判空、判满冲突 循环队列常规操作 定义循环队列结构体 初始化循环队列 循环队列判满 循环队列判空 计算循环队列的长度 循环队列 入队(EnQueue...每移动一次, 队中元素都要移动 2、将队列空间设想成一个循环的表,即分配给队列的 m 个存储单元可以循环使用,当 rear 为 MAXSIZE 时,若队列的开始端空着,又可从头使用空着的空间。...引入循环队列 base[0] 接在 base[MAXSIZE -1] 之后,若 rear + 1 == M,则令 rear = 0 实现方法: 利用 模(mod,C语言中: %)运算。...解决方案: 1.另外设一个标致以区别队空、队满 2.另设一个变量,记录元素个数 3.少用一个元素空间 本文实现的方法就是第三种。 ?...欢迎大家下载 C语言实现数据结构
链式队列(C语言实现) 链式队列的存储结构: 我们知道,队列是操作受限制的线性表,队列有队头和队尾,插入元素的一端称为队头,删除元素的一端称为队尾。...练市队列的队头指针指向当前队列的队头结点位置,队尾指针指向队列的当前队尾结点位置。对于不带头结点的链式队列,出队列时可直接删除队头指针所指的结点,因此,链式队列不带头结点更方便。...示意图(感觉图画的有点垮) 头文件:LQueue.h typedef struct node//节点结构体 { DataType data; struct node *next; }LQNode...\n"); return 0; } else { *d=Q.front->data; return 1; } } //撤销动态申请的存储空间 void Destroy(LQueue...list; int x; QueueInitiate(&list); for(int i=0;i<10;i++) { QueueAppend(&list,i+1); } printf("链式队列的出队顺序为
--------------------*/ typedef struct Node { ElemType data; // 元素数据 struct Node *next; // 链式队列中结点元素的指针...ElemType.cpp /*** *ElemType.cpp - ElemType的实现 * ****/ #include #include "ElemType.h" int...,即队列的动态链式存储实现 * * *题目:实验4 队列的动态链式存储实现 * * ****/ #include #include #include <memory.h...初始条件: 队列Q已存在 操作结果: 返回Q中数据元素的个数 函数参数: LinkQueue Q 队列Q 返回值: int 数据元素的个数 ----------------------...初始条件: 队列Q已存在 操作结果: 删除链式队列的头结点 函数参数: LinkQueue *Q 队列Q ElemType *e 待插入的数据元素 返回值: bool 操作是否成功
一、什么是循环队列 1、基本概念 队列就是一个能够实现“先进先出”的存储结构,队列分为链式队列和静态队列。...静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。...b、当队列为空时,front与rear的值相等,但不一定为零。 c、当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置。 ...这个问题比较复杂,如下图所示(此图转载),假设数组的存数空间为7,此时已经存放1,a,5,7,22,90六个元素了循环队列出队,如果在往数组中添加一个元素,则rear=front;此时,队列满与队列空的判断条件...解决这个问题有两个办法:一是增加一个参数,用来记录数组中当前元素的个数;第二个办法是,少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满。
->rear==Q->front) { printf("队列已满无法插入!")...int QueueDelete(SeqQueue *Q,DataType *d) { if(Q->count==0) { printf("队列已空无法出队列!")...; return 0; } else { *d=Q->queue[Q->front]; //取出队头元素存入d中 Q->front=(Q...计数器减1 return 1; } } //取队头数据元素 int QueueGet(SeqQueue Q,DataType *d) { if(Q.count==0) { printf("队列已空无法出队列...SeqQueue queue; QueueInitiate(&queue); for(int i=0;i<10;i++) { QueueAppend(&queue,i+1); } printf("出队列的序列为
- Node:节点 - xLinkQueue:节点控制器 -- head:总是指向队列头 -- end:总是指向队列尾 - 创建队列时,实际是创建了xLinkQueue,之后对队列的操作都是通过它 -...添加节点时,创建的Node,并将内容复制进它的buff中 - 弹出队列时,将Node中的内容先复制出来,在free释放内存 - 不是循环队列,有待改进 - 单个节点的buff最大不超过(1024*3),...如queueCreate(20, 1024*3);(不知道为什么,在我的STM32F4上申请1024*4失败) util.c /** 工具包 */ #include "util.h" static..."); return 0; } } /** 从内存中销毁整个队列 */ void queueDestory(xLinkQueue* queue) { uint16_t total = queue...Node *head; // 队列头节点 uint8_t length; // 记录队列的长度(已使用多少个节点) uint8_t size; // 每个节点的buff的大小 uint16
栈和队列 栈 分析 初始化与销毁栈 出栈入栈与判断栈为空 获取栈顶元素 获取栈中有效元素个数 队列 分析 初始化与销毁队列 入列,出列与判断队列是否为空 获取队列头部,尾部元素 获取队列中有效元素个数...StackEmpty(ps)); return ps->a[ps->top - 1]; } 获取栈中有效元素个数 top也就等于栈中数据的数量。...int StackSize(ST* ps)//获取栈中有效的元素 { assert(ps); return ps->top; } 队列 分析 队列是从队头出,队尾入,数组就没有链表好用了,所以我们用单向链表...typedef struct Queue { QL* head;//头结点,指向队列的队头 QL* tail;//尾结点,指向队列的队尾 int siz;//计算有多少个结点 }Qu; 初始化与销毁队列...free(cur); cur = del; } q->head = q->tail = NULL; q->siz = 0; } 入列,出列与判断队列是否为空 入列 这里需要考虑队列是否为空的尾插
个人主页: :✨✨✨初阶牛✨✨✨ 强烈推荐优质专栏: C++的世界(持续更新中) 推荐专栏1: C语言初阶 推荐专栏2: C语言进阶 个人信条: 知行合一 前言 在做这个题目之前,应当熟悉栈和队列这两种数据结构....栈和队列都是常见的数据结构,它们是基于数组或链表实现的线性数据结构。...} //将除了最后一个要删除的元素以外其他元素,倒数据到空队列 while(QueueSize(Notempty)>1) { //将有元素的队列中的队头的值放入空队列中...(myStackFree) 代码实现: void myStackFree(MyStack* obj) { //先释放栈中申请的链式队列 QueueDestroy(&obj->q1);...} //将除了最后一个要删除的元素以外其他元素,倒数据到空队列 while(QueueSize(Notempty)>1) { //将有元素的队列中的队头的值放入空队列中
队列简称队,它也是一种操作受限的线性表,其限制为仅允许在表的一端进行插入操作,而在表的另一端进行删除操作。...****************/void xiaohui(SqQueue *&q){//释放q占用的存储空间 free(q);}/**************判断队列是否为空**********/bool...return false; t=q->front;//t指向首节点 if (q->front==q->rear)//原来队列中只有一个数据结点时 q->front=q->rear=NULL; else...//原来队列中有两个或两个以上结点时 q->front=q->front->next; e=t->date; free(t); return true; } 通过下面这个运用队列的例子...panduanshifouweikong(q))//队列不空 { chuduilie(q,e);//出队一个元素e jinduilie(q,e);//将刚出队的元素进队 } } printf
用队列实现栈 225....用队列实现栈 - 力扣(LeetCode) (leetcode-cn.com) 目的:用队列实现栈,从先进先出——>先进后出, 1234这四个数据依次从队列1的队尾进入,要让4先出,一个队列是无法实现的...将123依次由队列2的队尾进入到队列2中,此时队列1中还剩一个4,将4弹出,同理,再将12依次进入到队列1中,将3弹出… 也就是说。 出数据把不为空的 队列数据向为空的队列中导,知道剩最后一个。...---- 队列的实现——队列的实现——【线性表】之队列_半生瓜のblog-CSDN博客 ---- typedef int QueueDataType; typedef struct QueueNode...element on top of the stack and returns that element. */ int myStackPop(MyStack* obj) { //谁不为空就把谁中的元素导到另一个队列中
用栈实现队列 232....用栈实现队列 - 力扣(LeetCode) (leetcode-cn.com) ---- 类似题目——用队列实现栈 LeetCode刷题(7)【栈&队列】用队列实现栈(C语言)_半生瓜のblog-CSDN...博客 ---- 思路: 用栈实现队列要比用队列实现栈要简单一些,我们不用来回在两个栈里面导数据,只需要导一次,然后在依次出栈就成功实现队列的出队操作了。...;//栈的容量——能放几个数据 }Stack; //初始化 void StackInit(Stack* ps) { assert(ps); ps->arry = (StackDataType*)malloc.../** Get the front element. */ int myQueuePeek(MyQueue* obj) { //出数据要从popST里面出 //如果popST里面是空的
本篇介绍一下编程中比较重要的一个数据结构队列,队列有个很显著的标志,对其中的数据是先进先出,如果是顺序存储结构可以说就是一个受限的数组,对链式存储结构就只能说是符合先进先出的规则了,这种数据结构在我们真正的编程中还是相当常用的...实际中根据需要去定制自己的队列。...开始 顺序队列的操作 首先我们来介绍一下顺序存储结构下的队列的定义和基本操作 添加适当的头文件,定义一个顺序存储数据结构, 这里需要添加头文件和定义一个队列的顺序数据结构 #include <stdio.h...,在顺序队列中,可以从数组的方式去理解,这样将会让你理解起来更简单 链式队列的操作 首先我们来介绍一下顺序存储结构下的队列的定义和基本操作 添加适当的头文件,定义一个队列链式存储数据结构, 这里需要添加头文件和定义一个队列的链式存储数据结构...1); } for (i = 0; i < 10; i++) { DeleteQueue(&q, &a[i]); printf("%d\n", a[i]); } } 在链式存储结构中的队列同样还是相对很简单的
生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题;从生活中,可以抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构。...队列分为链式队列和静态队列;静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。...true; else return false; } 6.如何判断循环队列是否为满 这个问题比较复杂,假设数组的存数空间为7,此时已经存放1,a,5,7,22,90六个元素了,如果在往数组中添加一个元素...,则rear=front;此时,队列满与队列空的判断条件front=rear相同,这样的话我们就不能判断队列到底是空还是满了; 解决这个问题有两个办法:一是增加一个参数,用来记录数组中当前元素的个数;第二个办法是...EmptyQueue(PQUEUE Q); bool Enqueue(PQUEUE Q, int val); bool Dequeue(PQUEUE Q, int *val); #endif queue.c文件代码
前言 用"栈实现队列",力扣中一道oj题,可以帮助刚接触"栈"和"队列"的新手更好的理解栈和队列这两种结构....出队操作 } MyQueue; 这里是借助两个栈用于模拟队列. ①:stackpush 模拟队列的入队 ②:stackpop 模拟队列的出队 1.2 初始化(myQueueCreate): 该队列是由两个栈实现的...步骤: 申请两个栈大小的空间. 申请失败时判断一下. 对队列中的两个栈,一次调用他们的初始化函数....(myQueuePush) 对于入队列的模拟实现很简单,只需要将数据压入栈(模拟入队列:stackpush)即可. void myQueuePush(MyQueue* obj, int x) {...,由于c语言不能像c++那样直接调用库. typedef int stacktype; typedef struct stack//定义栈的类型 { stacktype* data; int top
这时一道非常经典的题型,因为栈和队列的性质是相反的,队列的数据是先入先出,栈的数据是后入先出,那么怎样使用两个队列实现栈呢? 225....用队列实现栈 这是题目的要求,如果使用C语言来实现的话,只能自己写一个队列了,这里我就不详细讲解了,具体实现思路在这: http://t.csdnimg.cn/0SiCq 代码如下: typedef...: 在实现这个栈之前我们需要有一个具体思路,栈是后进先出,队列是先进后出,那么在插入上是没有区别的,在删除上就需要将对列的尾部删除,那么如何实现对列的尾部删除呢?...1.栈的定义 题目要求是使用两个队列实现栈,那么就直接在栈的定义里面包含两个队列即可。...使用while循环来实现遍历插入和删除,结束条件为nonempty内的数据为1,也就是队列的尾部数据,在循环内使用QueuePush将nonempty的头部数据插入到empty,每次插入之后要删除掉原节点
结构要素:队列容量 内存指针 元素个数 队列头 对列尾 */ /**********************************************************...**************/ #define QUEUE_CAPACITY 3 //队列容量 typedef struct tag_queue { int *pQueue; //队列内存指针...int head; //队列头 int tail; //队列尾 int length; //元素个数 }LineQueue; int InitQueue(LineQueue...myQueue->length; } int EnQueue(LineQueue *myQueue, int element) { if(QueueFull(myQueue))//判断他是否为满的操作...myQueue->length++;//大小++1 return 1; } int DeQueue(LineQueue *myQueue, int *element)//取出来,是从head开始取出的啦
这期内容就不详细具体展开了,但该有的代码还是有的,学习数据结构重点就是要亲自把代码实现,所以如果您再自己亲自写代码的过程中有什么疑问欢迎大家评论区讨论。 废话不多说直接上代码。...目录 1.栈代码实现 1.1主要功能介绍 2.队列代码实现 2.1主要功能介绍 ---- ...1.栈代码实现 1.1主要内容: 栈的初始化、元素入栈、元素出栈、获取栈顶元素、打印栈。 ...push(S, 2); push(S, 3); pop(S); printf("%d\n", Gettop(S)); printStack(S); return 0; } 2.队列代码实现...其实队列时只能在一端插入,另一端删除的线性表。
领取专属 10元无门槛券
手把手带您无忧上云