循环队列
初稿:2017-11-19 14:12:20
循环队列:本质是数组,采用循环方式,可以避免随着进队入队造成的空间浪费。
知识点:N个连续的存储单元,第一个单元编号是0,最后一个单元是N-1; i代表任意一个单元的编号,++i % N能实现i的值从0走到N-1再自动回到0,依次循环往复。
- 队空:rear == front; rear单元是空的,front是存在元素的
- 队满:rear+1 == front;注意这种判满条件会造成一个存储单元的浪费。
- 出队:front = (front + 1) % QUEUE_SIZE
- 入队:rear = (rear + 1) % QUEUE_SIZE
- 统计元素个数:((*Q).rear - (*Q).front + QUEUE_SIZE) % QUEUE_SIZE
1 #include"头文件.h" 2 #define QUEUE_SIZE 100//队列的容量 3 typedef struct { 4 int Q[QUEUE_SIZE]; 5 int front; 6 int rear; 7 }Queue; 8 /*初始化队列,空队列*/ 9 void InitQueue(Queue *Q) { 10 (*Q).front = 0; 11 (*Q).rear = 0; 12 } 13 /*判空*/ 14 bool IsEmpty(Queue *Q) { 15 return (*Q).front == (*Q).rear ? true : false; 16 } 17 /*判满*/ 18 bool IsFull(Queue *Q) { 19 return (*Q).rear + 1 == (*Q).front ? true : false; 20 } 21 /*进队*/ 22 void EnterQueue(Queue *Q,int value) { 23 if (IsFull(Q)) { 24 printf("队列已满!\n"); return; 25 } 26 (*Q).Q[(*Q).rear] = value; 27 (*Q).rear = ((*Q).rear + 1) % QUEUE_SIZE; 28 } 29 /*入队*/ 30 void OutQueue(Queue *Q, int *value) { 31 if (IsEmpty(Q)) { 32 printf("空队列,无法出队!\n"); return; 33 } 34 *value = (*Q).Q[(*Q).front]; 35 (*Q).front = ((*Q).front + 1) % QUEUE_SIZE; 36 } 37 /*统计队列元素个数*/ 38 int TotalNum(Queue *Q) { 39 return ((*Q).rear - (*Q).front + QUEUE_SIZE) % QUEUE_SIZE; 40 } 41 int main() { 42 Queue Q; int var; 43 InitQueue(&Q); 44 printf("1,2,3进队\n"); 45 EnterQueue(&Q, 1); 46 EnterQueue(&Q, 2); 47 EnterQueue(&Q, 3); 48 OutQueue(&Q, &var); 49 printf("出队元素是%d\n", var); 50 printf("队列含有%d个元素\n", TotalNum(&Q)); 51 system("pause"); 52 return 0; 53 }