首页
学习
活动
专区
圈层
工具
发布

循环队列出队-单个指针下循环链表的入队与出队

循环链表的入队出队   题目是这样的: 设以不带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针。编写相应的入队和出队程序。   ...思考方向   队列嘛,先进先出,用循环链表存储,再有个尾指针,逻辑结构就是这样的   入队   入队分三步:   新结点指向头结点   尾结点指向新节点   尾指针指向新的尾结点   出队   先进先出嘛...,头结点删了就行   理论上直接尾结点指向第二个就完事了   但这样只是找不到了原来的头结点,它依然是存在于内存中的,虽说眼不见为净吧   ,但它确确实实是存在的循环队列出队循环队列出队,一旦堆积,这队列容量就会越来越小...所以还是要把它删除掉的(delete)   具体代码   存储数据就以int为例,其他的自己适应性更改就行   结点    struct Node{ int data;...Node* next; };//创建结构体——结点   循环队列    class CirQueue { private: Node* p; public

50920
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    (全网首发)循环队列字符串入队出队

    上次上机题,循环队列入队出队,给了尾指针和长度,虽然算法有些复杂,但还是比较容易能想到。 不过在给朱老师验收的时候,老师竟然问了一个问题:不是数字,改成字符串行不行?...一开始我以为很简单,不就是改个数据类型的事,结果打脸了,在机房搞了几小时都没整出来。 没想到,仅仅这么微小的改动,难度天差地别。...,知道的可以在评论区指点指点) 还有个坑,连续scanf读取的时候,会把回车读进去,这时候需要及时清除键盘缓冲区fflush(stdin); 不多说了,困扰一天的难题解决心情不错,放上代码 //循环队列入队出队...=NULL) printf("%s\n",p); break; case -1: exit(0); } }while(1); } //置空队 void...->rear]=(char*)malloc(100*sizeof(char)); strcpy(sq->sequ[sq->rear],x); sq->quelen++; } } //添加出队算法

    37820

    【数据结构】线性表(十一)队列:双端队列及其基本操作(初始化、判空、判满、头部入队、尾部入队、头部出队、尾部出队、存取队首队尾元素)

    进行删除的一端称为队头(front),进行插入的一端称为队尾(rear)。没有元素的队列称为空队列(简称空队)。   ...如图,在空队列中依次加入元素a1,a2,a3,a4,a5,出队次序仍然是a1,a2,a3,a4,a5 . 2....:删除队首元素(出队); peek():获取队首的元素值(存取); 同普通线性表一样,队列也可以用顺序存储和链接存储两种方式来实现: 二、顺序队列   参考前文:【数据结构】线性表(八)队列:顺序队列及其基本操作...(初始化、判空、判满、入队、出队、存取队首元素) 三、链式队列   参考前文:【数据结构】线性表(九)队列:链式队列及其基本操作(初始化、判空、入队、出队、存取队首元素) 双端队列   双端队列(Double-ended...双端队列的操作包括: 在队列头部插入元素(头部入队); 在队列尾部插入元素(尾部入队); 在队列头部删除元素(头部出队),并返回该元素; 在队列尾部删除元素(尾部出队),并返回该元素; 获取队列头部的元素

    36910

    数据结构之队列:初始化、入队、出队与源码全解析

    一、队列 1.1 概念与结构 概念:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的性质 入队列:进行插入操作的一端称为队尾...出队列:进行删除操作的一端称为队头 队列如果使用数组结构的话,头部的插入删除时间复杂就是O(n) 队列遵循 “先进先出”(FIFO)原则,通常需要两个指针(或索引): 一个指向队头...(front),表示下一个要出队的元素 一个指向队尾(rear),表示下一个要入队的位置 出队操作:当队头元素被移除后,front 指针需要后移。...,空间会更大,所以一般情况下并不会使用双向链表 但是单链表的插入数据的时间复杂度还可以优化,删除数据是队头的操作,时间复杂度为O(1),可以让phead指针始终指向队列的头,只额外增加一个ptail指针指向尾节点...指向next指针指向的节点,但是此时ptail就是野指针了 //出队--对头 void QueuePop(Queue* pq); 1.2.5 取对头和取队尾 //取对头数据 QDataType QueueFront

    20010

    C语言数据结构与算法--简单实现队列的入队和出队

    只 允许在表的一端进行插入,而在另一端删除元素,如日常生活中的排队现象。队列中 允许插入的一端叫队尾(rear),允许删除的一端称队头(front)。...队列为空的 条件是队头指针和队尾指针均指向头结点。实际 上链队列的操作为单链表的插入和删除操作的特 殊情况。 链队列插入与删除元素时的指针变化情况如 下图。...特点是无法用动态 分配的一维数组实现循环队列。 (三)循环队列入队、出队实现思路 1.循环队列入队算法 入队算法过程为:判断队列是否已满?...如果已满则退出;否则,队尾指针加 1, 并在队尾插入新的元素。 2.循环队列出队算法 出队算法过程为:判断队列是否为空?如果为空则退出;否则,队头指针加 1,并删除队头元素。...//出队操作 void OutputQueue(queue* Q) { if (Q->front == Q->rear) return; //如果非空,实现可循环出队 Q->front = (

    76410

    【数据结构】线性表(九)队列:链式队列及其基本操作(初始化、判空、入队、出队、存取队首元素)

    进行删除的一端称为队头(front),进行插入的一端称为队尾(rear)。没有元素的队列称为空队列(简称空队)。   ...:删除队首元素(出队); peek():获取队首的元素值(存取); 同普通线性表一样,队列也可以用顺序存储和链接存储两种方式来实现: 二、顺序队列   参考前文:线性表(八)队列:顺序队列及其基本操作...(初始化、判空、判满、入队、出队、存取队首元素) 三、链式队列   用链接存储方式实现的队列称为链式队列。...如果队头指针更新后为空,则表示队列已经为空,将队尾指针也设置为空。 最后返回出队的数据值。 7....判断队列是否为空 如果为空则打印错误信息并返回 -1。 如果队列不为空,则直接返回队头节点的数据值。 8.

    59110

    【数据结构】线性表(八)队列:顺序队列及其基本操作(初始化、判空、判满、入队、出队、存取队首元素)

    一、队列 1. 定义 队列是一种操作受限的线性表,对于它的所有插入都在表的一端进行,所有的删除(以至几乎所有的存取)都在表的另一端进行,且这些操作又都是按照先进先出(FIFO)的原则进行的。...进行删除的一端称为队头(front),进行插入的一端称为队尾(rear)。没有元素的队列称为空队列(简称空队)。   ...如图,在空队列中依次加入元素a1,a2,a3,a4,a5,出队次序仍然是a1,a2,a3,a4,a5 . 2....:删除队首元素(出队); peek():获取队首的元素值(存取); 同普通线性表一样,队列也可以用顺序存储和链接存储两种方式来实现: 二、顺序队列   用顺序存储方式实现的堆栈称为顺序队列。...调用 dequeueSequentialQueue 函数两次,依次将队列中的元素出队并打印 再次使用 peekSequentialQueue 函数获取队首元素并打印 调用 enqueueSequentialQueue

    84110

    【数据结构】线性表(十)队列:循环队列及其基本操作(初始化、判空、判满、入队、出队、存取队首元素)

    进行删除的一端称为队头(front),进行插入的一端称为队尾(rear)。没有元素的队列称为空队列(简称空队)。   ...如图,在空队列中依次加入元素a1,a2,a3,a4,a5,出队次序仍然是a1,a2,a3,a4,a5 . 2....:删除队首元素(出队); peek():获取队首的元素值(存取); 同普通线性表一样,队列也可以用顺序存储和链接存储两种方式来实现: 顺序队列   参考前文:线性表(八)队列:顺序队列及其基本操作...(初始化、判空、判满、入队、出队、存取队首元素)   关于顺序队列,删除队头元素有两种方式: ⑴ 不要求队头元素必须存放在数组的第一个位置。...该方式的优点是无须改变诸队列元素的地址,缺点是front值随着队头元素的删除而不断增加,整个队列向数组的后端位置移动,随着队尾元素的不断加入,必然出现数组后端没有可用空间的情况,而数组前端的大量空间却被闲置

    53910

    循环队列出队-数据结构与算法 | 循环队列

    循环队列   实际中我们还会用到一种队列叫做循环队列,这种队列把存储空间前后连接起来,形成像环一样的结构,解决了内存空间浪费的问题   这里我们用顺序结构来实现,因为为了防止溢出的情况,这里我们需要多开一个数据的空间用作缓冲...,这部分不用于存数据,用于防止溢出,当数组访问到这一部分时就将他归零,实现循环的结构。   ...每次入数据通过队尾指针入,出数据通过队首指针出,和队列的操作方法差不多,每一步骤的具体实现思路会在下面写出 数据结构    typedef int DataType; typedef...(CircularQueue* obj); //循环队列出队 DataType CircularQueueFront(CircularQueue* obj); //获取循环队列队首...,如果满了则返回false,为什么使用这个公式我会在下面的判断队满的函数中写到,没满则将数据存到队尾指针的位置,如果队尾指针达到了我们多开的那个位置,则让队尾指针归零   出队列    bool

    58210

    循环队列出队-队列,顺序队列与循环队列

    进行插入操作的端称为队尾,进行删除操作的端称为队头。   队列中的数据元素称为队列元素。队列中没有元素时,称为空队列。队列只允许在一端插入,另一端删除,所以队列是一种先进先出的线性表。   1....出队操作:删去front所指的元素,front加1后返回被删元素。   ...2)、“真上溢”现象:当队列满时,继续往队列中插入元素,从而使数组越界产生程序代码崩坏。   3)、“假上溢”现象:入队和出队操作,头尾指针不断增加,致使被删元素的空间永远无法重新利用。...循环队列   循环队列是无论插入或删除元素,一旦队头指针(front)或队尾指针(rear)增1时超出了所分配的队列空间,就让队头指针和队尾指针(rear)指向该连续空间的起始位置。...DFS:深度优先遍历,先进后出,借助栈实现。   BFS:广度优先遍历,先进先出循环队列出队,借助队列实现。 本文共 1032 个字数,平均阅读时长 ≈ 3分钟

    1.2K40

    循环队列出队-数组循环队列

    我们知道队列这种数据结构的物理实现方式主要还是两种,一种是链队列(自定义节点类),另一种则是使用数组实现,两者各有优势。...此处我们将要介绍的循环队列其实是队列的一种具体实现,由于一般的数组实现的队列结构在频繁出队的情况下,会产生假溢出现象循环队列出队,导致数组使用效率降低,所以引入循环队列这种结构。...队列这种数据结构,无论你是用链表实现,还是用数组实现,它都是要有两个指针分别指向队头和队尾。在我们数组的实现方式中,用两个int型变量用于记录队头和队尾的索引。   ...head永远指向该队列的队头元素,tail则指向该队列最后一个元素的下一位置,当有入队操作时:   当有出队操作时:   当遇到出队操作时,head会移向下一元素位置。...上述文字基本完成了队循环队列的理论介绍,下面我们看在Java中对该数据结构的具体实现是怎样的。

    1.6K10

    循环队列出队-栈和队列的实现

    此外,当返回栈顶元素时循环队列出队,最后插入的元素会被返回,因此,栈的特点是“后进先出”   表示和实现   栈支持的操作有:   插入、删除、返回栈顶元素、计算栈中元素个数、判断栈是否为空   同时,...perror("realloc fail"); exit(-1); } }ps->a[ps->top++]=x; }   元素的出栈操作为从栈顶删除元素...队列只允许元素在队头删除,在队尾插入。因此,最早进入队列的元素最早出队。   循环队列   循环队列是队列的一种顺序表示循环队列出队,使用数组实现,同时需要两个指针分别指向队头和队尾。   ...由于队列的特性,先进先出,当有元素入队的时候队尾指针+1,出队时队头指针+1。...而会存在一种队列未满(队头删除了一些元素),尾指针指向数组边界,新元素无法入队的情况,如下图所示:   故需要将顺序空间更改为环状空间,即使用循环队列:   头、尾指针取模运算,在顺序表内以头尾相衔接的模式移动

    51820

    循环队列出队-循环队列的c语言实现

    说白了循环队列就是一个数组循环队列出队,我们把这个数组当成首尾相连来使用(写到数组的末尾后从头开始写)。   ...这个问题比较复杂,如下图所示(此图转载),假设数组的存数空间为7,此时已经存放1,a,5,7,22,90六个元素了循环队列出队,如果在往数组中添加一个元素,则rear=front;此时,队列满与队列空的判断条件...3、循环队列入队   (1)把值存在rear所在的位置;   (2)rear=(rear+1)% ,其中代表数组的长度;   4、循环队列出队   (1)先保存出队的值;   (2)front=(front...这个简单的例子只是为了演示循环队列的使用而已,先把数据放入循环队列,然后取出打印出来。   ...(PQUEUE Q); //将数据放入队列保存 bool Enqueue(PQUEUE Q, Item val); //从队列取出数据到val bool Dequeue(

    98830

    浅入浅出消息队列

    相信在学生时代大家都遇到过上面的这种情况,如果我们将在学校上课抽象成一个系统,那这种情况就是一个很常见的消息队列的使用场景。...在上述实例中,要提的问题就是 「消息」,提问题的学生是 「生产者」,回答问题的老师是 「消费者」,收集问题的课代表是 「消息队列」。...•发布订阅模式(Publish-Subscribe,PubSub),一个生产者发送的每一个消息,都会发送到所有订阅了此队列的消费者,这样对这个消息感兴趣的系统都可以拿到这个消息。...[1] MQ 的使用成本 如此一看,消息队列确实有很多好处,不过凡事皆有利弊,消息队列的使用也是有一定的使用成本的。...收益>成本 这点也很好理解,如果使用维护一个消息队列的成本,比消息队列对项目的实际效益要大,那使用他作甚?

    37310

    深入浅出 RabbitMQ-TTL+死信队列+延迟队列

    深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK) 前情摘要: 1、深入浅出 RabbitMQ-核心概念介绍与容器化部署 2、深入浅出 RabbitMQ-简单队列实战 3、深入浅出...RabbitMQ-工作队列实战(轮训策略VS公平策略) 4、深入浅出 RabbitMQ-交换机详解与发布订阅模型实战 4、深入浅出 RabbitMQ-路由模式详解 5、深入浅出 RabbitMQ...- 主题模式(Topic) 6、深入浅出 RabbitMQ - SpringBoot2.X整合RabbitMQ实战 8、深入浅出 RabbitMQ-消息可靠性投递 9、深入浅出 RabbitMQ-RabbitMQ...即时清理:当消息过期时,RabbitMQ会直接将其从队列中移除(若绑定死信交换机,则转发为死信,而非直接删除)。 2....、死信队列:给“过期/异常消息”找个“安全屋” 有了TTL,过期消息会被直接删除,但实际开发中,我们可能需要保留这些消息(比如排查“为什么订单消息没被消费”);另外,消费者拒收的异常消息、队列满了放不下的消息

    21900

    栈和队列深入浅出

    概念: 栈一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守先进后出的原则。...压栈:栈的插入操作叫做进栈/压栈/入栈; 出栈 : 栈的 删除操作叫做出栈 。 压栈和出栈出入数据都在栈顶。...概念 : 队列 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表 队列具有先进先出 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 2...//删除前提下获取队列的队头 public int poll() { if (isEmpty()){ return -1; }...//不删除前提下获取队列的队头 public int peek() { if (isEmpty()){ return -1; }

    23210
    领券