简单循环队列,实现了基本功能。
#include<stdio.h>
#include<stdlib.h>
#define LOOPQSIZE 10//定义环的长度
typedef struct {
int front;//头
int rear;//尾 最后一个元素的下一个位置
int* base;//基址
}SqLQueue;
//初始化
void Init_SqLQueue(SqLQueue* q) {
q->base = (int*)malloc(LOOPQSIZE * sizeof(int));
if (!q->base) exit(0);
q->front = q->rear = 0;
printf("初始化完成!\n");
}
//销毁
void Destroy_SqLQueue(SqLQueue* q) {
free(q->base);
printf("销毁完成!\n");
}
//清空
void Clear_SqLQueue(SqLQueue* q) {
q->front = q->rear = 0;
printf("已清空!\n");
}
//求长度
int Length_SqLQueue(SqLQueue* q) {
return (q->rear - q->front + LOOPQSIZE) % LOOPQSIZE;//环长度的求法,注意尾指针并不指向最后一个元素
}
//判空
int IsEmpty_SqLQueue(SqLQueue* q) {
return q->rear == q->front;
}
//入队
void En_SqLQueue(SqLQueue* q,int e) {
//判定是否满 满的时候,rear指向front前一个位置
if ((q->rear + 1) % LOOPQSIZE == q->front) exit(0);
else{
q->base[q->rear] = e;
//*(q->base + q->rear) = e;
q->rear = (q->rear + 1) % LOOPQSIZE;
}
}
//出队
void De_SqLQueue(SqLQueue* q, int& e) {
if (IsEmpty_SqLQueue(q)) exit(0);
else {
e = q->base[q->front];
q->front = (q->front + 1) % LOOPQSIZE;
}
}
//打印
void Print_SqLQueue(SqLQueue *q) {
if (!IsEmpty_SqLQueue(q)) {
for (int i = 0; i < Length_SqLQueue(q); i++)
printf("%d ", q->base[(q->front + i) % LOOPQSIZE]);
}
else exit(0);
printf("\n");
}
int main() {
SqLQueue q;
int e;
Init_SqLQueue(&q);
printf("长度是%d\n", Length_SqLQueue(&q));
for (int i = 0; i < 9; i++)//要考虑队列的容量
En_SqLQueue(&q, i);
printf("长度是%d\n", Length_SqLQueue(&q));
Print_SqLQueue(&q);
De_SqLQueue(&q, e);
Print_SqLQueue(&q);
printf("长度是%d\n", Length_SqLQueue(&q));
Destroy_SqLQueue(&q);
return 0;
}