循环队列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);
}

运行结果:

相关推荐
好好研究26 分钟前
学习栈和队列的插入和删除操作
数据结构·学习
彭祥.1 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
lzb_kkk1 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
胖大和尚3 小时前
clang 编译器怎么查看在编译过程中做了哪些优化
c++·clang
挺菜的3 小时前
【算法刷题记录(简单题)003】统计大写字母个数(java代码实现)
java·数据结构·算法
2401_858286114 小时前
125.【C语言】数据结构之归并排序递归解法
c语言·开发语言·数据结构·算法·排序算法·归并排序
钱彬 (Qian Bin)4 小时前
一文掌握Qt Quick数字图像处理项目开发(基于Qt 6.9 C++和QML,代码开源)
c++·开源·qml·qt quick·qt6.9·数字图像处理项目·美观界面
双叶8365 小时前
(C++)学生管理系统(正式版)(map数组的应用)(string应用)(引用)(文件储存的应用)(C++教学)(C++项目)
c语言·开发语言·数据结构·c++
源代码•宸5 小时前
C++高频知识点(二)
开发语言·c++·经验分享
jyan_敬言6 小时前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio