数据结构环形队列学习(c语言)


  • 实现效果

  • 效果模型描述

代码设置队列长度为5,数组实际大小为6(队列长度加1)
黄色方格是队列头,灰色是未被使用内存,蓝色是队列元素

Example1: 当队列添加满元素时(此时队列元素为5)

Example2: 删除Example1中队列3个元素(此时队列元素为2)

Example3: 在Example2队列基础上增加3个元素(此时队列长度为5)

Example4: 在Example3队列基础上删除3个元素(此时队列长度为2)


  • 代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>//Queue struct
typedef struct
{long unsigned head;long unsigned tail;size_t arr_len;int *queue;
} Queue;//Create an int array as Queue.Initial.Parameter QueueLen is length of Queue
void NewCommonQueue(Queue *q, size_t QueueLen);
//Add a element for Queue.
void addElement(Queue *q, int elem);
//Delete a element of Queue.
int popElement(Queue *q);
//Show Queue.
void showQueue(Queue *q);
//Judge if Queue is empty.
int isEmpty(Queue *q);
//Judge if Queue is full.
int isFull(Queue *q);
//Get the element quality of Queue.
size_t getQueLen(Queue *q);
//Delete all element of Queue.
void clearQueue(Queue *q);int main(void)
{Queue q;//Example1NewCommonQueue(&q, 5);addElement(&q, 1);addElement(&q, 2);addElement(&q, 3);addElement(&q, 4);addElement(&q, 5);puts("**********Example1**********");showQueue(&q);//Example2int A = popElement(&q);int B = popElement(&q);int C = popElement(&q);puts("**********Example2**********");showQueue(&q);printf("A = %d\n", A);printf("B = %d\n", B);printf("C = %d\n", C);//Example3addElement(&q, 6);addElement(&q, 7);addElement(&q, 8);puts("**********Example3**********");showQueue(&q);//Example4popElement(&q);popElement(&q);popElement(&q);puts("**********Example4**********");showQueue(&q);clearQueue(&q);showQueue(&q);free(q.queue);return 0;
}void clearQueue(Queue *q)
{if(q == NULL){fputs("NULL point exception\n", stderr);exit(0);}q->head = 0;q->tail = 0;return;
}size_t getQueLen(Queue *q)
{if(q == NULL){fputs("NULL point exception\n", stderr);exit(0);}size_t arrayLen = q->arr_len;long unsigned tem_tail = q->tail;long unsigned tem_head = q->head;//Work out the element quilty in the Queue.size_t queLen = (tem_tail - tem_head + arrayLen) % arrayLen;return queLen;
}int isEmpty(Queue *q)
{if(q == NULL){fputs("NULL point exception\n", stderr);exit(0);}return q->head == q->tail ? 1 : 0;//Empty return 1, instead 0.
}int isFull(Queue *q)
{if(q == NULL){fputs("NULL point exception\n", stderr);exit(0);}long unsigned nextTail = (q->tail + 1) % q->arr_len;return nextTail == q->head ? 1 : 0;//Full return 1, instead 0.
}int popElement(Queue *q)
{if(q == NULL){fputs("NULL point exception\n", stderr);exit(0);}//Exit program if Queue is empty.if(isEmpty(q)){fputs("Queue Empty Error!\n", stderr);exit(0);}//Delete element, head go backward.q->head = (q->head + 1) % q->arr_len;//Return the deleted value.int ret = q->queue[q->head];return ret;
}void showQueue(Queue *q)
{if(q == NULL){fputs("NULL point exception\n", stderr);exit(0);}size_t queLen = getQueLen(q);size_t arrLen = q->arr_len;long unsigned tem_head = q->head;int *que = q->queue;size_t i;long unsigned index;printf("head = %lu\n", q->head);printf("tail = %lu\n", q->tail);printf("queLength = %lu\n", queLen);printf("{ ");for(i = 0; i < queLen; i++){index = (tem_head + i + 1) % arrLen;printf("%d ", que[index]);}printf("}");puts("");puts("");return;
}void addElement(Queue *q, int elem)
{if(q == NULL){fputs("Null point exception\n", stderr);exit(0);}//Exit program if Queue is full.if(isFull(q)){fputs("Full Queue error!\n", stderr);exit(0);}//Tail go backward.q->tail = (q->tail + 1) % q->arr_len;//Add a new element.q->queue[q->tail] = elem;return;}void NewCommonQueue(Queue *q, size_t QueueLen)
{if(q == NULL){fputs("Null point exception\n", stderr);exit(0);}int *newArray = (int *)malloc(sizeof(int) * (QueueLen + 1));//Program exit if malloc failure.if(newArray == NULL){fputs("malloc error!!!\n", stderr);exit(0);}q->arr_len = QueueLen + 1;q->head = 0;q->tail = 0;q->queue = newArray;return;
}

数据结构环形队列学习(c语言)相关推荐

  1. 数据结构——环形队列的原理(模拟环形队列)

    数据结构--环形队列的原理(模拟环形队列) 知识点简要介绍: 队列:一种特殊的线性表,包含队列头.队列尾,只允许在队列头进行删除操作,在队列为进行删除操作 分类:     顺序队列.循环队列(环形队列 ...

  2. 数据结构--环形队列的介绍与实现

    数据结构--环形队列实现 一.环形队列实现原理 环形队列的几个判断条件 二.代码实现 1.环形队列类(CircleQueue) 2.环形队列类测试类 3.程序运行结果 4.完整代码 环形队列可以用数组 ...

  3. C语言数据结构——环形队列

    队列都有两个指针,分别指向队头和队尾,用于出队入队 这里使用顺序表来实现队列,设置头元素下标为front,指向队头,尾元素下标为rear,指向队尾的下一个节点.之所以不选择链表,是因为链表不便于查找队 ...

  4. 数据结构-环形队列 C和C++的实现

    队列: 含义:是一种先入先出(FIFO)的数据结构. 当我们把数据一个一个放入队列中.当我们需要用到这些数据时,每次都从队列的头部取出第一个数据进行处理.就像排队进场一样,先排队的人先进场. 结构如下 ...

  5. c语言环形队列用法,C语言,环形队列

    什么是环形队列? 环形缓冲区是一个非常典型的数据结构,这种数据结构符合生产者,消费者模型,可以理解它是一个水坑,生产者不断的往里面灌水,消费者就不断的从里面取出水. 那就可能会有人问,既然需要灌水,又 ...

  6. c语言程序结构环形队列入队,C语言 环形队列

    队列 :队列是一种先进先出的数据结构. 比如说 排队买票, 有一个售票口,最多能排30人,那么最大存储空间就是30人, 每当有1个新人过来排队,就会站在队尾,这就叫入队, 每当有1个人买到票了,就会离 ...

  7. 数据结构 - 环形队列

    关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 环形队列图 思路: 1,front变量,初始值为 0,指向队列的第一个元素也是待取出的数据, 也就是说arr[f ...

  8. 数据结构--环形队列

    一.环形队列的概念: 1.使用数组模拟队列,空间只能使用一次,不能重复利用.浪费空间. 2.使用环形队列可以重复使用.节省空间 二.循环队列图解:  三.数组模拟环形队列思路: 1.首先front和r ...

  9. 静态环形队列(C语言)

    说明: 1.静态环形队列就是长度已提前确定,可以按顺序循环写入数据(0.1.2...9.0.1.2...):可以按顺序循环读取数据(0.1.2...9.0.1.2...):通过write记录写入个数, ...

最新文章

  1. 一款直击痛点的优秀http框架,让我超高效率完成了和第三方接口的对接
  2. vue中的minix
  3. php依次替换文本字符串中的图片src地址
  4. matlab radiogroup,RadioGroup和CheckBox的使用 | 学步园
  5. 【数据结构与算法】之深入解析“分数加减运算”的求解思路与算法示例
  6. hibernate总结-N+1问题
  7. python基础(part3)--运算符
  8. 第二十二章 面向对象
  9. 低级键盘钩子 DLL
  10. Mybatis配置文件参数定义
  11. pcl从一个点云里面导出下标
  12. sdoi2015 位图+区间+矩形
  13. css如何调整红心样式_条码软件如何调整条码数据的样式
  14. 环形数组求最大子数组之和
  15. 悄悄告诉你Java面试必备技能是什么?
  16. 微信小程序中如何应用音频
  17. doe五步法_DOE系列--试验设计(DOE)五部曲
  18. 多个excel工作簿合并_你还在使用复制粘贴合并表格?一个公式搞定Excel多工作簿合并...
  19. tomcat出现404的原因_tomcat访问项目报404是什么原因?
  20. python docx首行缩进两字符的设定方法

热门文章

  1. 闭式系统蒸汽管径推荐速度_动力蒸汽管径计算公式及焓值对照表
  2. 现如今的电脑还有必要进行关机吗?
  3. PhEmail:基于Python的开源网络钓鱼测试工具
  4. mybatis中使用if标签判断时,如果判断的字段是boolean(数据库bit)时,传的值是0或者false时,mybatis会把它变成空,相当于没有传值
  5. CleanMyMac4.12最新Mac电脑系统垃圾清理神器
  6. 智能商业化模式:信息流广告的动态展现策略
  7. 如何开发一个药房药店小程序?药店小程序需要什么资质?
  8. ZooKeeper 可视化工具
  9. 五年级计算机教案及反思,2014-2015学年度下册五年级信息技术教案(有教学反思).doc...
  10. 美观靓丽 Android平台四大桌面软件横评