一、循环队列概述
循环队列 是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。
队头指针(front) 指向队列的队头元素。
队尾指针(rear) 指向队列的最后一个元素的下一个元素。
pBase 指向块内存的首地址

判断队列空:if(front==rear&&front==0)
判断队列满:if(front=(rear+1)%n)
插入:rear=(rear+1)%n
删除:front=(front+1)%n
二、循环队列存储结构
在顺序实现是 队尾指针和队头指针指的就是下标

1、初始化循环队列

2、返回队列中已有元素个数

3、判断循环队列是否为满

4、将元素e进行入队

5、判断循环队列是否为空

6、遍历队内所有元素

7、出队,出队元素由e返回

8、清空队列

9、销毁队列

完整代码
1 // 循环队列.cpp 2 # include<stdio.h> 3 # include<malloc.h> 4 # include<stdlib.h> 5 # define MAX_SIZE 6//队列最大长度 + 1 6 7 8 typedef int ElemType; 9 10 typedef struct CircularQueue//队列参数 11 { 12 int * pBase;//指向数组首地址的指针 13 int front;//出队下标指向队列的要出队的第一个元素 14 int rear;//入队下标,指向队列元入队元素的下一个空间 15 }CircularQueue, *pCircularQueue; 16 17 //1、初始化循环队列 18 void InitCircularQueue(pCircularQueue Q); 19 // 2、返回队列中已有元素个数 20 int CircularQueueLength(pCircularQueue Q); 21 // 3、判断循环队列是否为满 22 bool CircularQueueIsFull(pCircularQueue Q); 23 // 4、将元素e进行入队 24 bool CircularQueueEn(pCircularQueue Q, ElemType e); 25 //5、判断循环队列是否为空 26 bool CircularQueueIsEmpty(pCircularQueue Q); 27 // 6、遍历队内所有元素 28 void CircularQueueTraverse(pCircularQueue Q); 29 //7、出队,出队元素由e返回 30 bool CircularQueueOut(pCircularQueue Q, ElemType &e); 31 //8、清空队列 32 void CircularQueueClear(pCircularQueue Q); 33 //9、销毁队列 34 void CircularQueueDestory(pCircularQueue Q); 35 36 37 38 int main() 39 { 40 CircularQueue Q; 41 InitCircularQueue(&Q); 42 if (CircularQueueIsEmpty(&Q)) 43 { 44 printf("队列为空\n"); 45 } 46 else 47 { 48 printf("队列不为空\n"); 49 } 50 51 for (int i = 0; i < 5; i++) 52 { 53 CircularQueueEn(&Q, 2*i); 54 } 55 CircularQueueTraverse(&Q); 56 ElemType e1; 57 for (int i = 0; i < 4; i++) 58 { 59 if (CircularQueueOut(&Q,e1)) 60 { 61 printf(" %d\n", e1); 62 } 63 } 64 printf("\n"); 65 CircularQueueTraverse(&Q); 66 67 return 0; 68 } 69 70 //1、初始化循环队列 71 void InitCircularQueue(pCircularQueue Q) 72 { 73 Q->pBase = (ElemType *)malloc(sizeof(ElemType)*MAX_SIZE); 74 if (Q->pBase==NULL) 75 { 76 printf("内存分配失败,程序退出!\n"); 77 exit(-1); 78 } 79 Q->front = Q->rear = 0; 80 } 81 82 // 2、返回队列中已有元素个数 83 int CircularQueueLength(pCircularQueue Q) 84 { 85 return (Q->rear - Q->front + MAX_SIZE) % MAX_SIZE; 86 } 87 88 // 3、判断循环队列是否为满 89 bool CircularQueueIsFull(pCircularQueue Q) 90 { 91 if ((Q->rear+1)%MAX_SIZE == Q->front) 92 { 93 return true; 94 } 95 return false; 96 } 97 // 4、将元素e进行入队 98 bool CircularQueueEn(pCircularQueue Q,ElemType e) 99 { 100 if (CircularQueueIsFull(Q)) 101 { 102 printf("队列已满,入队失败!\n"); 103 return false; 104 } 105 Q->pBase[Q->rear] = e; 106 Q->rear = (Q->rear + 1) % MAX_SIZE; 107 return true; 108 } 109 110 //5、判断循环队列是否为空 111 bool CircularQueueIsEmpty(pCircularQueue Q) 112 { 113 if (Q->front == Q->rear) 114 return true; 115 else 116 return false; 117 } 118 // 6、遍历队内所有元素 119 void CircularQueueTraverse(pCircularQueue Q) 120 { 121 int i = Q->front; 122 while (i!=Q->rear) 123 { 124 printf(" %d", Q->pBase[i]); 125 i = (i+1)%MAX_SIZE; 126 } 127 printf("\n"); 128 } 129 130 //7、出队,出队元素由e返回 131 bool CircularQueueOut(pCircularQueue Q, ElemType &e) 132 { 133 if (CircularQueueIsEmpty(Q)) 134 { 135 printf("队列为空,出队失败!\n"); 136 return false; 137 } 138 e = Q->pBase[Q->front]; 139 Q->front = (Q->front + 1) % MAX_SIZE; 140 return true; 141 } 142 //8、清空队列 143 void CircularQueueClear(pCircularQueue Q) 144 { 145 Q->front = Q->rear = 0; 146 } 147 //9、销毁队列 148 void CircularQueueDestory(pCircularQueue Q) 149 { 150 if (Q->pBase)//如果队列存在 151 { 152 free(Q->pBase);//释放队列所占内存 153 } 154 Q->pBase = NULL;//不指向任何存储空间 155 Q->front = Q->rear = 0; 156 }
浙公网安备 33010602011771号