队列 :队列是一种先进先出的数据结构。
比如说
排队买票,
有一个售票口,最多能排30人,那么最大存储空间就是30人,
每当有1个新人过来排队,就会站在队尾,这就叫入队,
每当有1个人买到票了,就会离开,就叫出队。
生活中,最前面1个人买完票后,队伍中剩下的每1个人都会向前走1位,
对于计算机来说,每个人动一下意味着要执行更多的代码,
如果卖票的人卖完第1个 ,第一个人就离开,
售票员就走向第2个,再走向第3个,
直到1队队伍尾走完,再进1队。售票员就重头开始走就会更方便。
========================================================
环形队列是这样的,不用每个人都向前移动1位,
在一个排满的队列中,当售票员卖了第1张票时,不要每个人向前移动。
因为1号位空出来了,下一个排队的人就站在1号位置上,队尾+1变成2,
售票员向前走了一步,再卖1张,
2号位置空出来了,下一个排队的人就到2号位置上,
队尾+1变成3,依次类推,
售票员卖到队伍尾部后又会重头开始来,依旧是按照1 2 3 的顺序,
就不需要执行更多的代码。
环形队列需要考虑以下内容: 1. 创建队列 (最大存储量,队列长度,队头下标,队尾下标,数组记录队伍每个下标的内容) 2. 删除队列,不需要的时候从内存中清除。 3. 队列为空判断,不能出队操作了。 4. 队列为满判断,不能入队操作了。 5. 遍历队列元素,验证队列内容是否按照要求来。
取余数就是为了,队伍再次从头开始排队。
代码就按照以上的需求进行建立
#define MAXSIZE 5 #include <iostream> // 队列包含的信息 typedef struct queue { int *qu; //用来存储全部的队列中的元素 int head; //队列头 int tail; //队尾 int qlength; //队列长度 int maxsize; //用来记录队列的最大容量 }QUEUE; // 初始化队列 QUEUE *CreateQueue ( int maxsize) { printf("[%lu]",sizeof(QUEUE)); QUEUE *q= (QUEUE *)malloc(sizeof(QUEUE)); if (q == NULL) { printf("Memory alloc failure\n"); exit(-1); } q->qu=(int *)malloc(sizeof(int)*maxsize); if(NULL==q->qu) { printf("Memory allocation failure"); exit(-1); //退出程序 } //分配完空间后,1开始队头队尾都在一起,因为没人,都为0长度也为0, q->head = 0; q->tail = 0; q->qlength = 0; q->maxsize = maxsize; return q; } // 判断空队列,长度为0则为空 bool Empty (QUEUE *q) { return q->qlength == 0 ? true : false; } // 判断满队列,长度=最大容量为满 bool Full (QUEUE *q) { return q->qlength == q->maxsize ? true : false; } //入队 bool Enqueue (QUEUE *q , int num) { // 队列不满才插入 if (Full(q)) { printf("队列满了,插入失败\n"); return false; }else{ //给队伍最尾添加赋值。 q->qu[q->tail] = num; //队尾向后移动一位,如果超过最大值,则从0开始,变成队尾 q->tail = (q->tail +1)%q->maxsize; //队伍长度+1 q->qlength ++; return true; } } // 出队 bool Dequeue (QUEUE *q) { // 队列有元素才能够删除 if (Empty(q)) { printf("队列为空,删除失败\n"); return false; }else{ //队头向后移动一位 超过最大值又重新 从0 开始计算 q->head = (q->head +1)%q->maxsize; // 队伍长度-1 q->qlength -- ; return true; } } // 遍历队列元素 void Traverse(QUEUE *q) { // 在队列长度范围内 打印队列从队列头 到队列尾的元素 for (int i=0 ; i<q->qlength; i++) { printf("%d ", q->qu[(q->head+i)%q->maxsize]); } printf("\n"); } int main(int argc, const char * argv[]) { // insert code here... std::cout << "Hello, World!\n"; QUEUE Q =*CreateQueue(MAXSIZE); if ( Empty(&Q)) { printf("空队列\n"); }; Enqueue(&Q, 10); Enqueue(&Q, 12); Enqueue(&Q, 14); if ( Empty(&Q)) { printf("空队列\n"); }; Enqueue(&Q, 16); Enqueue(&Q, 18); Dequeue(&Q); Enqueue(&Q, 20); if (Full(&Q)) { printf("满队列\n"); } Traverse(&Q); return 0; }运行结果
Hello, World! [24]空队列 满队列 12 14 16 18 20 Program ended with exit code: 0