循环队列

 初稿: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 }

 

posted @ 2017-11-19 14:08  LevelIsBubble  阅读(255)  评论(0编辑  收藏  举报