队列 —— 循环队列
循环对列的存储结构定义:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define M 5 4 typedef int QueueElementType; 5 typedef struct{ 6 QueueElementType element[M];/*队列的元素空间,用数组实现*/ 7 int front;/*头指针指示器*/ 8 int rear;/*尾指针指示器*/ 9 }SeqQueue;
循环对列初始化:
1 SeqQueue* InitQueue(){ 2 /*malloc动态分配空间*/ 3 SeqQueue* q = (SeqQueue*)malloc(sizeof(SeqQueue)); 4 /*初始化一个空的循环队列*/ 5 q->front = q->rear = 0; 6 return q; 7 }
循环对列入队:
1 int enterQueue(SeqQueue* q, QueueElementType x) { 2 /*元素x进入循环队列,需要判断循环队列是否已满*/ 3 if ((q->rear+1)%M==q->front) 4 { 5 return false; 6 } 7 /*元素x从尾部进入循环队列*/ 8 q->element[q->rear] = x; 9 /*循环队列的尾指针向后移动1位,(q->rear+1)%M:实现循环作用*/ 10 q->rear = (q->rear + 1) % M; 11 return true; 12 }
循环对列出队:
1 int deleteQueue(SeqQueue* q, QueueElementType* x) { 2 /*循环队列出队操作,需要判断循环队列是否为空*/ 3 if (q->front==q->rear) { 4 return false; 5 } 6 *x = q->element[q->front]; 7 q->front = (q->front + 1) % M; 8 return true; 9 }
循环对列长度:
1 int length(SeqQueue *q) { 2 return (q->rear - q->front + M) % M; 3 }
循环对列的打印:
1 void printfQueue(SeqQueue* q) { 2 printf("循环队列的元素:"); 3 for (int i = q->front; i <q->rear; i++) 4 { 5 printf("%d ", q->element[i]); 6 } 7 printf("\n"); 8 }
主函数:
1 int main() { 2 SeqQueue* q = initQueue(); 3 QueueElementType x; 4 5 enterQueue(q, 10); 6 enterQueue(q, 20); 7 enterQueue(q, 30); 8 enterQueue(q, 40); 9 printfQueue(q); 10 11 /*循环队列的长度*/ 12 int l = length(q); 13 printf("循环队列的长度:%d\n", l); 14 15 deleteQueue(q, &x); 16 printf("循环队列出队的元素:%d\n", x); 17 deleteQueue(q, &x); 18 printf("循环队列出队的元素:%d\n", x); 19 deleteQueue(q, &x); 20 printf("循环队列出队的元素:%d\n", x); 21 deleteQueue(q, &x); 22 printf("循环队列出队的元素:%d\n", x); 23 24 printfQueue(q); 25 return 0; 26 }