//循环队列 用顺序表来实现的队列
//因为顺序栈\链式栈 这俩插入和删除的时间复杂度都是O(1)
//而此时的时间复杂度不是O(1)
//4个难点
//1 如何对顺序表进行改造 让其的时间复杂度变为1
// 只需要再插入和删除的时候 让其队头和队尾指针移动 让其数据本身不移动
//2 怎么将出队时的空闲格子再次利用
// 让其首尾相连
//3 如果头尾相连 判空和判满条件冲突了 怎么解决
// 1 加一个标签 加一个成员变量 Size (保存当前元素个数) 判空 头尾相遇 && Size=0; 判满 头尾相遇 && Size!=0;
// 2 用尾巴处一个空格作为标记 此时头尾相遇 只能当作判空条件 而判满条件 队尾指针向后再走一步遇到队头
//4 怎么找到一个通用公式 用来求出当前循环队列有效元素的个数
// Size=(rear-front +MAXSIZE)%MAXSIZE
#include<stdio.h>
#include<assert.h>
#include "Seqlist.h"
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "Circle_Quene.h"
//1初始化
void Init_CircleQuene(CircleQuene* pcq)
{
pcq->base = (ELEMTYPE*)malloc(MAXSIZE * sizeof(ELEMTYPE));
if (pcq->base == NULL)
exit(EXIT_FAILURE);
pcq->front = 0;
pcq->rear = 0;
/*pcq->base = (ELEMTYPE*)malloc(MAXSIZE * sizeof(ELEMTYPE);
if (pcq->base == NULL)
exit(EXIT_FAILURE);
pcq->front = 0;
pcq->rear = 0;*/
}
//2入队
bool Push(CircleQuene* pcq, ELEMTYPE val)
{
assert(pcq != NULL);
if (Full(pcq))
return false;
CircleQuene* p = pcq;
pcq->base[pcq->rear]=val;
pcq->rear = (pcq->rear + 1) % MAXSIZE;
return true;
//assert(pcq != NULL);
//if (Full(pcq))
// return false;
//CircleQuene* p = pcq;
//pcq->base[pcq->rear] = val;
//pcq->rear = (pcq->rear + 1) % MAXSIZE;
}
//3出队
bool Pop(CircleQuene* pcq)
{
assert(pcq != NULL);
if (Empty(pcq))
return false;
pcq->front=(pcq->front+1)%MAXSIZE;
/*assert(pcq != NULL);
if (Empty(pcq))
return false;
pcq->front = (pcq->front + 1) % MAXSIZE;*/
}
bool Empty(CircleQuene* pcq)
{
//assert
return pcq->front == pcq->rear;
/*return pcq->front == pcq->rear;*/
}
//5.5 判满
bool Full(CircleQuene* pcq)
{
//assert
return (pcq->rear + 1) % MAXSIZE == pcq->front;
/*return (pcq->rear + 1) % MAXSIZE == pcq->front;*/
}
//6.打印(用来测试的)
void Show(CircleQuene* pcq)
{
//assert
for (int i = pcq->front; i != pcq->rear; i = (i + 1) % MAXSIZE)
{
printf("%d ", pcq->base[i]);
}
printf("\n");
///*for (int i = pcq->front; i != pcq->rear; i = (i + 1) % MAXSIZE)
//{
// printf("%d ", pcq->base[i]);
//}
//printf("\n");*/
}
//6.5 清空
void Clear(CircleQuene* pcq)
{
//assert
pcq->front = 0;
pcq->rear = 0;
//pcq->front = pcq->rear = 0;
//pcq->front = pcq->rear;
/*pcq->front = 0;
pcq->rear = 0;*/
}
void Destroy(CircleQuene* pcq)
{
//assert
free(pcq->base);
pcq->base = NULL;
pcq->front = pcq->rear = 0;
////free(pcq->base);
//pcq->base = NULL;
//pcq->front = pcq->rear = 0;
}
int Get_Size(CircleQuene* pcq)
{
return (pcq->rear - pcq->front + MAXSIZE) % MAXSIZE;
/*return (pcq->rear - pcq->front + MAXSIZE) % MAXSIZE;*/
}