数据结构环形队列学习(c语言)
数据结构环形队列学习(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.环形队列类(CircleQueue) 2.环形队列类测试类 3.程序运行结果 4.完整代码 环形队列可以用数组 ...
- C语言数据结构——环形队列
队列都有两个指针,分别指向队头和队尾,用于出队入队 这里使用顺序表来实现队列,设置头元素下标为front,指向队头,尾元素下标为rear,指向队尾的下一个节点.之所以不选择链表,是因为链表不便于查找队 ...
- 数据结构-环形队列 C和C++的实现
队列: 含义:是一种先入先出(FIFO)的数据结构. 当我们把数据一个一个放入队列中.当我们需要用到这些数据时,每次都从队列的头部取出第一个数据进行处理.就像排队进场一样,先排队的人先进场. 结构如下 ...
- c语言环形队列用法,C语言,环形队列
什么是环形队列? 环形缓冲区是一个非常典型的数据结构,这种数据结构符合生产者,消费者模型,可以理解它是一个水坑,生产者不断的往里面灌水,消费者就不断的从里面取出水. 那就可能会有人问,既然需要灌水,又 ...
- c语言程序结构环形队列入队,C语言 环形队列
队列 :队列是一种先进先出的数据结构. 比如说 排队买票, 有一个售票口,最多能排30人,那么最大存储空间就是30人, 每当有1个新人过来排队,就会站在队尾,这就叫入队, 每当有1个人买到票了,就会离 ...
- 数据结构 - 环形队列
关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 环形队列图 思路: 1,front变量,初始值为 0,指向队列的第一个元素也是待取出的数据, 也就是说arr[f ...
- 数据结构--环形队列
一.环形队列的概念: 1.使用数组模拟队列,空间只能使用一次,不能重复利用.浪费空间. 2.使用环形队列可以重复使用.节省空间 二.循环队列图解: 三.数组模拟环形队列思路: 1.首先front和r ...
- 静态环形队列(C语言)
说明: 1.静态环形队列就是长度已提前确定,可以按顺序循环写入数据(0.1.2...9.0.1.2...):可以按顺序循环读取数据(0.1.2...9.0.1.2...):通过write记录写入个数, ...
最新文章
- 一款直击痛点的优秀http框架,让我超高效率完成了和第三方接口的对接
- vue中的minix
- php依次替换文本字符串中的图片src地址
- matlab radiogroup,RadioGroup和CheckBox的使用 | 学步园
- 【数据结构与算法】之深入解析“分数加减运算”的求解思路与算法示例
- hibernate总结-N+1问题
- python基础(part3)--运算符
- 第二十二章 面向对象
- 低级键盘钩子 DLL
- Mybatis配置文件参数定义
- pcl从一个点云里面导出下标
- sdoi2015 位图+区间+矩形
- css如何调整红心样式_条码软件如何调整条码数据的样式
- 环形数组求最大子数组之和
- 悄悄告诉你Java面试必备技能是什么?
- 微信小程序中如何应用音频
- doe五步法_DOE系列--试验设计(DOE)五部曲
- 多个excel工作簿合并_你还在使用复制粘贴合并表格?一个公式搞定Excel多工作簿合并...
- tomcat出现404的原因_tomcat访问项目报404是什么原因?
- python docx首行缩进两字符的设定方法
热门文章
- 闭式系统蒸汽管径推荐速度_动力蒸汽管径计算公式及焓值对照表
- 现如今的电脑还有必要进行关机吗?
- PhEmail:基于Python的开源网络钓鱼测试工具
- mybatis中使用if标签判断时,如果判断的字段是boolean(数据库bit)时,传的值是0或者false时,mybatis会把它变成空,相当于没有传值
- CleanMyMac4.12最新Mac电脑系统垃圾清理神器
- 智能商业化模式:信息流广告的动态展现策略
- 如何开发一个药房药店小程序?药店小程序需要什么资质?
- ZooKeeper 可视化工具
- 五年级计算机教案及反思,2014-2015学年度下册五年级信息技术教案(有教学反思).doc...
- 美观靓丽 Android平台四大桌面软件横评