赞
踩
目录
循环队列,遵循队列思想, 可以存储k个数据,增加空间的复用率。
- typedef int TypeData;
-
- typedef struct CircleQueue
- {
- TypeData* a; //开辟数组作为循环队列的主体
- int head; //队头的位置
- int tail; //队尾的位置
- int size; //记录当前存放的数量
- int capacity; //记录最大的存放数量
- }CQ;
- void Init(CQ* pr,TypeData k)
- {
- assert(pr); //断言pr不为空
- pr->capacity = k;//初始化最大存放值为k
- pr->head = pr->tail = pr->size = 0;//初始化队尾和队头位置
- TypeData* ptr = (TypeData*)malloc(sizeof(TypeData) * k);//开辟数组
- if (ptr == NULL)
- {
- perror("malloc:");
- return;
- }
- pr->a = ptr;
- }
- void CPush(CQ* pr,TypeData val)
- {
- if (pr->size == pr->capacity) //因为循环队列有最大存放量,所以需要判断是否有空位可以入队
- {
- printf("数据已满,不可插入数据\n");
- return;
- }
-
- pr->a[pr->tail] = val; //在队尾入队
-
- pr->tail = (pr->tail + 1) % (pr->capacity);
- //队尾向后移动一位,如果队尾已经在数组末位,则移动到数组首位
-
- pr->size++; //当前存储数据个数加一
- }
-
- void CPop(CQ* pr)
- {
- if (pr->size == 0)
- {
- printf("队列为空,不可出队\n");
- return;
- }
-
- pr->head = (pr->head + 1) % (pr->capacity);
- //队头向后移动一位,如果队头在数组末位,则移动到数组首位
-
- pr->size--; //当前存储数据个数减一
- }
- int Empty(CQ* pr)
- {
- return(pr->size == 0);
- }
-
- int Full(CQ* pr)
- {
- return(pr->size == pr->capacity);
- }
因为我们这里引入了size和capacity所以只需要判断这俩变量的关系即可。
- //如果队列不为空,直接返回即可
- TypeData Front(CQ* pr)
- {
- if (pr->size == 0)
- {
- printf("队列为空\n");
- return -1;
- }
-
- return(pr->a[pr->head]);
- }
-
-
- //如果队列不为空,返回队尾前一个数据
- TypeData Back(CQ* pr)
- {
- if (pr->size == 0)
- {
- printf("队列为空\n");
- return -1;
- }
-
- int pos = pr->tail - 1;
- if (pos < 0) //如果队尾在数组首位,则它的前一个则为数组末位
- pos = pr->capacity - 1;
- return (pr->a[pos]);
- }
- //直接释放数组a即可
- void Destroy(CQ* pr)
- {
- free(pr->a);
- pr->size = pr->capacity = pr->head = pr->tail = 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。