当前位置: 首页 > article >正文

循环队列c语言版

一、循环队列结构体

typedef int  QueueDataType; 
#define CQ_MAX_SIZE  10

typedef struct CircularQueue
{
   QueueDataType data[CQ_MAX_SIZE];
   
   /**标记队列首*/
   QueueDataType head;

   /**标记队列尾部*/
   QueueDataType rear;

} CircularQueue;

二、循环队列操作函数声明


/**创建队列*/
CircularQueue* create_circular_queue();

/**队列是否已满*/
bool  isFull(CircularQueue* queue);

/**队列是否为空*/
bool  isEmpty(CircularQueue* queue);


/**入队列*/
bool  enqueue(CircularQueue* queue,QueueDataType el);


/**出队列*/
QueueDataType dequeue(CircularQueue* queue);


/**输出队列*/
void show_queue(CircularQueue* queue);

/**销毁队列*/
void   destory_queue(CircularQueue* queue);

三、循环队列操作函数定义

/**创建队列*/
CircularQueue* create_circular_queue()
{
   CircularQueue* queue = (CircularQueue*) malloc(sizeof(CircularQueue));
   if(queue ==  NULL)
   {
    perror("CircularQueue分配内存空间失败");
    return NULL;
   }
   queue->head  = 0;
   queue->rear  = 0;
   return queue;
}

/**队列是否为空*/
bool  isEmpty(CircularQueue* queue)
{
  return queue->head == queue->rear;
}

/**队列是否已满*/
bool  isFull(CircularQueue* queue)
{
 //  rear是冗余出来的一个空间,置于队尾,用于记当前队中元素的个数
  return  (queue->rear + 1)%CQ_MAX_SIZE == queue->head;
}

/**入队列*/
bool  enqueue(CircularQueue* queue,QueueDataType el)
{
    if(isFull(queue))
    {
        perror("队列已满");
        return  false;
    }
    queue->data[queue->rear%CQ_MAX_SIZE]  = el ;
    queue->rear++;
    return true;
}


/**出队列*/
QueueDataType dequeue(CircularQueue* queue)
{
    if(isEmpty(queue))
    {
      perror("对列中暂无元素");
      return -1;
    }
    QueueDataType el = queue->data[queue->head%CQ_MAX_SIZE];
    queue->head++;
    return el;
}


/**输出队列*/
void show_queue(CircularQueue* queue)
{
    if(isEmpty(queue))
    {
      perror("对列中暂无元素");
      return ;
    }
    int i =  queue->head;
    while ( i < queue->rear)
    {
       QueueDataType el = queue->data[i%CQ_MAX_SIZE];
       printf("el=%d\n",el); 
       i++;
    }
}


void   destory_queue(CircularQueue* queue)
{
    free(queue);
}

四、测试队列

void  test_cricular_queue()
{
  CircularQueue *quque = create_circular_queue();
  QueueDataType arr[] =  {11,21,31,41,51,61,71,81,91,101};
  int  i = 0;
  for(;i<10;i++)
  {
     enqueue(quque,arr[i]);
  }
  show_queue(quque);
  QueueDataType  el = dequeue(quque);
  printf("取出队列元素el=%d\n",el);
  destory_queue(quque);
}

运行结果:


http://www.kler.cn/a/106187.html

相关文章:

  • 编写一个生成凯撒密码的程序
  • 【MQTT.fx 客户端接入 阿里云平台信息配置】
  • SystemVerilog学习笔记(十一):接口
  • [ 网络安全介绍 3 ] 网络安全事件相关案例有哪些?
  • LabVIEW中的UDP与TCP比较
  • Oracle Instant Client 23.5安装配置完整教程
  • 【uniapp】富文本
  • 棋盘格测距-单目相机(OpenCV/C++)
  • nginx浏览器缓存和上流缓存expires指令_nginx配置HTTPS
  • Miniconda、Vscode下载和conda源、pip源设置
  • RHCE8 资料整理(四)
  • 【机器学习可解释性】3.部分依赖图
  • Java API访问HDFS
  • 2.18每日一题(不直接给f(x)的定积分及变上限积分)
  • TSINGSEE青犀智慧仓储可视化视频智能监管系统方案
  • Flume基本使用--mysql数据输出
  • 微前端qiankun接入Vue和React项目
  • CNN实现与训练--------------以cifar10数据集为例进行演示(基于Tensorflow)
  • JDK11下载、安装与配置、运行第一个Java程序教程
  • 虹科 | 解决方案 | 汽车示波器 学校教学方案
  • 安装 tensorflow==1.15.2 遇见的问题
  • 一文了解独立站黑科技:clock斗篷技术
  • [推荐]Linux安装与配置虚拟机之虚拟机服务器坏境配置
  • Elasticsearch:使用 Open AI 和 Langchain 的 RAG - Retrieval Augmented Generation (一)
  • 『第七章』翩翩起舞的雨燕:顺序与并发执行
  • Games104现代游戏引擎笔记 网络游戏架构基础