分享

C语言 环形队列

 goodwangLib 2017-09-29

这里写图片描述

队列 :队列是一种先进先出的数据结构。

比如说

排队买票,

有一个售票口,最多能排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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137

运行结果

Hello, World!
[24]空队列
满队列
12 14 16 18 20 
Program ended with exit code: 0
  • 1
  • 2
  • 3
  • 4
  • 5

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多