题解 | #【模板】循环队列#
【模板】循环队列
https://www.nowcoder.com/practice/0a3a216e50004d8bb5da43ad38bcfcbf
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> typedef struct { int* data; int front; int back; int capacity;//空间容量 = 固定长度 + 1 = n + 1,多开一个方便判空、判满 }cirQueue; void QueueInit(cirQueue* obj,int n) { obj->data = (int*)malloc(sizeof(int) * (n + 1)); obj->front = obj->back = 0; obj->capacity = n + 1; } bool QueueIsFull(cirQueue* obj) { //back尾的下一个是front头就是满了 return (obj->back + 1) % obj->capacity == obj->front; } bool QueueIsEmpty(cirQueue* obj) { return obj->front == obj->back; } bool QueuePush(cirQueue* obj,int x) { if (QueueIsFull(obj)) { return false; } obj->data[obj->back++] = x; //注意边界 //模等一下置为有效范围 obj->back %= obj->capacity; return true; } //empty传址用来判断循环队列是不是空 int QueueFront(cirQueue* obj,int* empty) { if (QueueIsEmpty(obj)) { *empty = 1; return 0; } return obj->data[obj->front]; } int QueuePop(cirQueue* obj,int* empty) { if (QueueIsEmpty(obj)) { *empty = 1; return 0; } int front = obj->data[obj->front++]; //注意边界 //模等一下置为有效范围 obj->front %= obj->capacity; return front; } int main() { int n = 0,q = 0; cirQueue obj; scanf("%d%d",&n,&q); QueueInit(&obj,n); while (q--) { int empty = 0; char s[6] = { 0 }; scanf("%s",&s); if (strcmp(s,"push") == 0) { int x = 0; scanf("%d",&x); bool flag = QueuePush(&obj,x); if (!flag) { printf("full\n"); } } else if (strcmp(s,"pop") == 0) { int front = QueuePop(&obj,&empty); if (empty == 1) { printf("empty\n"); } else { printf("%d\n",front); } } else { int front = QueueFront(&obj,&empty); if (empty == 1) { printf("empty\n"); } else { printf("%d\n",front); } } } return 0; }