循环队列

C语言实现循环队列

荒凉一梦 提交于 2020-02-10 13:05:08
SequenceQueue.h #pragma once #define ElemType char #define QuenueSize 5 #define ERROR -1 #define OVERFLOW -2 typedef struct SequenceQueue { ElemType* base; int front; int rear; int size; } Queue; void InitQueue(Queue& Q);//初始化队列 void DestroyQueue(Queue& Q);//销毁队列 void ClearQueue(Queue& Q);//清空队列 bool EmptyQueue(Queue Q);//判断队列是否为空 ElemType* GetFront(Queue Q);//获取队首元素 void EnQueue(Queue& Q, ElemType e);//入队 void DeQueue(Queue& Q, ElemType& e);//出队 int QueueLength(Queue Q);//获取队列长度 void QueueTraverse(Queue Q, void(*f)(ElemType e));//遍历队列 SequenceQueue.c #include <stdlib.h> #include <stdio.h>

循环队列

扶醉桌前 提交于 2020-02-09 10:43:35
假设循环队列最多能容纳k个整型数字,那么我们需要开辟k+1个空间,如图,当k = 6的时候,空间大小为7,即array.length() = 7.在起始的时候,front = rear = 0;在每次添加数字的时候( enqueue() ),rear都会+1,而k = 6,也就是从初始位置rear = 0时,最多一直连续添加6次,此时 rear = 6,无法再次添加,那么要想再次添加,只有通过出队列(dequeue()),每出一次队列,front的值都会+1,最多加到front = 6,此时,队列为空,那么rear和front的值都为6,再次入队列,rear会重新从0开始计算,再次出队列,front也会从0开始计算。每次删除的时候,从(front+1)/array.lenth()的位置删,每次添加的时候从(rear+1)/array.length()的位置添加. class MyCircularQueue { private int front;//队列头 private int rear;//队列尾 private int usedSize;//数据个数 private int[] elem;//数组 /** Initialize your data structure here. * Set the size of the queue to be k. */ public

第3章 栈和队列

。_饼干妹妹 提交于 2020-02-05 09:01:48
3.1 栈的定义及抽象数据类型 栈(stack)是一种特殊的线性表,这种表只能在固定的一端进行插入与删除运算。通常称固定插入、删除的一端为栈顶(top),而另一端称为栈底(bottom)。位于栈顶和栈底的元素分别称为顶元和底元。当表中没有元素时,称为空栈。为了与一般的线性表相区别,通常将栈的插入操作称为入栈,将删除操作称为出栈。 线性表S=(a,b,c,d,e) 将S中的元素按照a、b、c、d、e的顺序依次入栈,则出栈的元素顺序为e、d、c、b、a 可以发现,最先进入栈中的元素a最后才出栈,最后入栈的元素e最先被出栈,因为栈的这一特性,故又将其称为后进先出的线性表(lastinfirstout,简称为LIFO)。 3.2 栈的实现 栈的实现既可以采用顺序存储结构也可以采用链式存储结构。采用顺序存储结构实现的栈称为顺序栈,采用链式存储结构实现的栈称为链栈 3.2.1 顺序栈 栈的初始化操作是指按指定的大小为栈动态分配一片连续的存储区,并将该存储区的首地址同时送给栈顶指针top和栈底指针base,表示栈里没有任何元素,此时的栈为空栈。若base的值为NULL时则表明栈不存在。当插入一个新元素时栈顶指针加1,当删除一个元素时栈顶指针减1。栈顶指针top始终比顶元超前一个位置,因此栈满的条件是top-base=stacksize。图3-3所示为栈顶指针和栈中元素的关系。 值得注意的是

数据结构——循环队列

允我心安 提交于 2020-02-04 03:00:48
一、队列 1、队列特点: ①、线性结构、具有队头和队尾,有且只有一个直接前驱和直接后继。 ②、只允许在一段插入(入队)、另一端删除(出队),且 先进先出 。 二、循环队列 顺序队列是队列得顺序存储结构,通过改进后成为循环队列。 1、规定 ①、front表示队头得前一个位置下标。 ②、rear表示队尾位置下标。 ③、队列空时: front = rear 。 2、改进后循环队列 三、用C语言实现顺序队列 1、构造存储结构 # define SIZE 8 typedef int datatype ; typedef struct seqqueue { datatype data [ SIZE ] ; // 数据域 int front ; // 队头前一个位置下标 int rear ; // 队尾位置下标 } seq_queue , * seq_pqueue ; 2、初始化 ①申请内存空间 ②front = rear = SIZE - 1 void init_seqqueue ( seq_pqueue * queue ) { ( * queue ) = ( seq_pqueue ) malloc ( sizeof ( seq_queue ) ) ; if ( NULL == ( * queue ) ) { perror ( "malloc" ) ; exit ( 1 ) ; } ( *

队列:顺序队列和循环队列

China☆狼群 提交于 2020-02-02 20:41:07
和栈的先进后出不同,队列的形式是先进先出,队列的想法来自于生活中排队的策略, 顾客在付款结账的时候,按照到来的先后顺序排队结账。先来的顾客先结账,后来的顾客后结账。 队列有两种实现形式:1 顺序表实现 2 循环顺序表  首先来看下顺序表的实现,在python中,队列的实现用list来写十分的方便。实现方式如下: class line_queue(): def __init__(self): self._elem=[] def push(self,elem): self._elem.append(elem) def pop(self): elem=self._elem.pop(0) return elem def queue_length(self): return len(self._elem) 和栈唯一的区别是,这里pop是pop(0),也就是首先进队列的数据出列。这个实现很简单,但是有一个问题,每次有元素出队列的时候,元素都必须要进行前移。这就带来了一个问题,它的操作复杂度为O(n),而不是O(1)。只有从尾部弹出元素也就是先进后出的时候复杂度为O(1). 那么如何才能满足O(1)的出列复杂度呢。我们可以考虑记住队头和队尾的位置。每次出队的时候直接将队头位置的元素弹出就可以了。具体的实现可以参考下图 下面来看下代码的实现: class line_queue_update():

郝斌数据结构学习记录(四)——队列的笔记及部分算法的c语言实现

可紊 提交于 2020-02-02 20:37:59
线性结构的常见应用:队列(两端操作) 定义 :一种可以实现“先进先出”的存储结构 分类 : 链式队列 , 静态队列 :用数组实现,通常都必须是循环队列 ①静态队列为什么必须是循环队列? 如果不使用循环队列,那么删除的元素所占用的空间将无法再次使用 ②循环队列需要几个参数来确定 两个:front,rear。 ③循环队列各个参数的含义 两个参数在不同场合有不同的含义 1)队列初始化:front和rear的值都是零 2)队列非空:front代表的是队列的第一个元素,rear代表的是队列的最后一个有效元素的下一个元素 3)队列空:front和rear的值相等,但不一定是零 ④循环队列入队的伪算法 1)将值存入rear代表的位置 2)rear=(rear+1)%数组的长度 ⑤循环队列出队的伪算法 front=(front+1)%数组的长度 ⑥如何判断循环队列是否为空 front==rear时队列一定为空 ⑦如何判断循环队列是否已满 方式(1)增加一个标识参数 方式(2)少用一个空间存储元素 (常用√) (rear+1)%数组长度==front 时为满 队列的具体 应用 : 所有和时间有关的操作都有队列的影子 VS2017中,c语言实现队列的初始化,入队,出队,遍历算法 #include<stdio.h> #include<stdlib.h> typedef struct queue {

自定义循环队列

早过忘川 提交于 2020-01-31 22:59:18
我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列通常使用数组实现。 public class CircleQueue<E> { private E[] elements= (E[]) new Object[10]; private int size=0; private int front=0; private int tail=0; public void add(E element){ if(size==elements.length){ throw new IndexOutOfBoundsException("队列已满"); } elements[tail]=element; tail=(tail+1)%elements.length; size++; } public E poll(){ if(size==0){ throw new RuntimeException("队列为空"); } E element=elements[front]; front=(front+1)%elements.length; size--; return element; } public boolean isEmpty(){ return front==tail; } public int size(){ return size; }

泛型动态循环队列的实现——Java

岁酱吖の 提交于 2020-01-31 11:39:41
队列的基本功能 public interface Queue < E > { void enqueue ( E e ) ; //元素入队 E dequeue ( ) ; //元素出队 E getFront ( ) ; //查看队头 int getSize ( ) ; //存储了多少数据 boolean isEmpty ( ) ; } 如何实现 使用数组存储数据,front存储队头元素的下标,tail存储队尾元素下一个元素的下标,元素入队,tial前移,元素出队,front前移。 front=tail时队列为空,front在tail前一格时队列满。(浪费了tail所指的空间,目的是更容易区分空和满两种情况,这样:队列容量=数组长度-1)。 代码 public class ArrayQueue < E > implements Queue < E > { private E [ ] data ; private int front , tail ; //指向队首元素 private int size ; //指向队尾元素下一个位置,即下一个元素的位置 public ArrayQueue ( int capacity ) { //*泛型类构造函数类名后不加<> data = ( E [ ] ) new Object [ capacity + 1 ] ; //数组长度比容量大1 front

Queue | 循环队列的数组实现

我的未来我决定 提交于 2020-01-28 04:15:21
目录 一、概述 1、队列ADT 2、队列的基本操作 3、队列的实现方式 二、队列的数组实现 1、队列的结构 2、清空队列 3、创建一个初始化队列 4、判断队列是否满 5、入队 6、判断队列是否为空 7、出队操作 一、概述 1、队列ADT 队列(Queue)是只允许 在一端进行插入操作 ,而 在另一端进行删除操作 的线性表。 队列是一种 先进先出 (First In First Out)的线性表。 允许插入的一端称为 队尾 ,插入数据的操作称为 入队 。 允许删除的一端称为 队头 ,删除数据的操作称为 出队 。 2、队列的基本操作 CreatQueue()  ——初始化队列 MakeQueueEmpty ——清空队列 EnQueue() ——进队列 DeQueue() ——出队列 IsQueueEmpty() ——判断队列是否为空 IsQueueFull() ——判断队列是否已满 3、队列的实现方式 队列可以由 数组 和 链表 两种形式实现队列操作。分别称为 顺序队列 和 链队列 。 且顺序队列还可以 实现循环 ,已增加空间的利用。 下面均讨论 顺序循环队列 。 二、队列的数组实现 1、队列的结构 typedef struct QueueRecord { int Capacity; //队列容积 int Front; //队头下标 int Rear; //队尾下标 int

AVR单片机教程——UART进阶

社会主义新天地 提交于 2020-01-25 23:27:48
本文隶属于 AVR单片机教程 系列。 在第一期中,我们已经开始使用UART来实现单片机开发板与计算机之间的通信,但只是简单地讲了讲一些概念和库函数的使用。在这一篇教程中,我们将从硬件与软件等各方面更深入地了解UART。 USART组件 一直在讲的UART其实是USART组件的一部分,USART比UART多了同步的一部分,但这一部分用得太少(我从来没用过),而且缺乏实例,所以就略过了。然而,单片机的设计者很机智地把这个鸡肋功能升华了一下,USART组件可以支持SPI模式。SPI是一种同步串行总线,可以支持很高的传输速率。这个功能使得ATmega324PA支持最多3个SPI通道,其中一个是纯SPI,另两个就是SPI模式下的USART。我们将在下一讲中揭开SPI的神秘面纱。 回到UART模式下的USART组件。开发板引出的 RX 和 TX 引脚是属于USART0组件的,因此使用时以下 n 都用 0 代替。 UART共有5个寄存器: UDRn 是收发数据寄存器,收( RXB )和发( TXB )使用不同的寄存器,但都通过 UDRn 来访问。向 TXB 写入一个字节,UART就开始发送; RXB 保存接收到的数据,带有额外一个字节的缓冲(如同下一节要讲的缓冲区)。 UCSRnA 包含UART状态位,如三个中断对应的标志,以及一些不常用的设置位。 UCSRnB 主要用于使能