基于循环数组实现的循环队列
解决了顺序队列中的假溢出导致的空间浪费问题
操作:
(1)初始化
//循环队列
typedef struct {int *data;//指针模拟声明数组int head,tail;//队头,队尾
}Queue;
//初始化
Queue *InitQueue()
{Queue *q = (Queue*)malloc(sizeof(Queue));if(q == NULL){printf("内存申请失败\n");return q;}q->data = (int*)malloc(sizeof(int)*maxx);if(q->data == NULL){printf("数组内存申请失败\n");free(q);return NULL;}q->head = 0;q->tail = 0;return q;
}
(2)入队
//入队
void push(Queue *q,int k)
{if(isFull(q) == 1){printf("队列已满\n");return ;}q->data[q->tail] = k;q->tail = (q->tail+1)%maxx;}
(3)出队
//出队
void pop(Queue *q)
{if(isEmpty(q) == 1){printf("队列为空\n");return ;}q->head = (q->head+1) % maxx;
}
(4)判满
下面呈现的是方案一
还有方案二和方案三:
方案二:新增int len = 0;来标记入队数据的个数
方案三:加一个标记int flag = 0;入队标记为1,出队标记为0,因为队列刚开始是空的,所以初始值设为0
为什么要这样做呢?因为判满和判空的条件重合,都是head == tail来判断,不好区分。
//判满(方案一)
int isFull(const Queue *q)
{if(q == NULL){printf("队列不存在\n");return -1;}if((q->tail+1) % maxx == q->head){return 1;//满}return 0;//非满
}
(5)判空
//判空
int isEmpty(const Queue *q)
{if(q == NULL){printf("队列不存在\n");return -1;}if(q->head == q->tail){return 1;//空}return 0;//非空
}