循环队列
队列是一种特殊的线性表,与堆、栈有点类似,但是队列值允许从队列的前端(Front)进行出队(删除),队列的后端进行插入(进队)。
实际的应用中,使用的是循环的队列。
循环队列的本质:是一个数组,只不过这个数组是可以被循环地进行存放数据。
2、循环队列的创建
typedef struct Queue { int *pBase; int Front; int Rear; }QUQUQ,*PQUEUE;
pBase : 指针,指向的是数组地址
Front : 指向的是队列的一个存放元素的单元,出队也是这里进行出队哦、
Rear:指向的是队列存放元素最后一个单元的下一个单元,这里进行进队。所以说,N 个单元循环队列(数组),只能保存 N-1 数据。
当循环队列是空的时候, Front 等于 Rear,而为满的时候,Front = (Rear + 1)%N;d
3、代码
typedef struct Queue { int *pBase; int Front; int Rear; }QUQUQ,*PQUEUE; // 循环队列的初始化 void init_queue(PQUEUE pTR) { pTR->pBase = (int *)malloc(sizeof(int) * 6); // 进队和出队指向同一个位置 pTR->Rear = pTR->Front = 0; } // 判断是否队列已经满了 bool is_full_queue(PQUEUE pTr) { PQUEUE pNew = pTr; if ( pNew->Front == (pNew->Rear + 1) % 6) { return true; } else { return false; } } void insert(PQUEUE pTr, int iVal) { PQUEUE pNew = pTr; if (is_full_queue(pTr)) { printf("满的队列,不能插入咯\n"); } pNew->pBase[pNew->Rear] = iVal; pNew->Rear = (pNew->Rear + 1) % 6; } // 遍历循环队列 void traver_queue(PQUEUE pTr) { int i = pTr->Front; while (i != pTr->Rear) { printf("%d\n", pTr->pBase[i]); i = (i + 1) % 6; } } // 判断队列是否为空 bool is_empty_queue(PQUEUE pTr) { if ( pTr->Front == pTr->Rear) { return true; } else { return false; } } // 出队的操作 void out_queue(PQUEUE pTr) { PQUEUE pNew = pTr; if (is_empty_queue(pNew)) { printf("空队列"); exit(-1); } printf("出队的数据是:%d", pNew->pBase[pNew->Front]); pNew->Front = (pNew->Front + 1) % 6; } int main(int argc, char **argv) { // 创建一个队列 QUQUQ QQ; init_queue(&QQ); // 入队 insert(&QQ, 1); insert(&QQ, 2); insert(&QQ, 3); insert(&QQ, 4); insert(&QQ, 5); // 遍历队列 traver_queue(&QQ); // 出队 out_queue(&QQ); while (1); }