<sub id="1djzl"><dfn id="1djzl"><ins id="1djzl"></ins></dfn></sub>

    <sub id="1djzl"><delect id="1djzl"></delect></sub>

    <address id="1djzl"></address>
    <address id="1djzl"><dfn id="1djzl"></dfn></address><address id="1djzl"></address><form id="1djzl"></form>

    <address id="1djzl"><dfn id="1djzl"></dfn></address>
    <address id="1djzl"><listing id="1djzl"></listing></address>
    <thead id="1djzl"><var id="1djzl"><mark id="1djzl"></mark></var></thead>

        <form id="1djzl"><listing id="1djzl"></listing></form>
        <address id="1djzl"><var id="1djzl"><output id="1djzl"></output></var></address>

          <sub id="1djzl"></sub>

            <address id="1djzl"><var id="1djzl"></var></address>

              <sub id="1djzl"><dfn id="1djzl"></dfn></sub><sub id="1djzl"><var id="1djzl"><ins id="1djzl"></ins></var></sub>

                  <sub id="1djzl"><var id="1djzl"><output id="1djzl"></output></var></sub>

                    循環隊列及C語言實現<一>

                    首頁    學習交流    C語言    循環隊列及C語言實現<一>

                     循環隊列是為了充分利用內存,進行數據操作的一種基本算法。具體實現方式可劃分為:鏈式隊列和靜態隊列,這里所謂的靜態是指在一片連續的內存區域進行數據操作。本文只講述靜態隊列,也是最簡單的實現方式,鏈式隊列以及鏈表的實現內容請參見我的其它博文。以下靜態循環隊列簡稱為循環隊列。
                      
                    一、循環隊列的特點及要素
                    <1> 先進先出(FIFO);
                    <2> 首尾元素 front 和 rear 的數值;
                    <3> 隊列操作: 隊列初始化、銷毀隊列、遍歷隊列、隊列滿、隊列空、入隊列,出隊列。
                    <4> 隊列滿判斷的兩種方式:因為需要區分與隊列空時 front 與 rear 的位置關系。
                    方式一:front == rear 并且 flag_full = true;  
                    方式二:front= (rear + 1) % size;

                    二、具體實現及輸出結果見下面程序,因為較為簡單,不作注解了。

                    #include <stdio.h>
                    #include <stdlib.h>

                    typedef struct queue{
                       
                    char *buf;
                       
                    int front;
                       
                    int rear;
                       
                    int size;
                    } Queue, *pQueue;

                    void Init_Queue(Queue *q, int maxsize)
                    {
                        q->buf = (
                    char *)malloc(sizeof(char) * maxsize);
                       
                    if (q->buf == NULL) {
                            perror(
                    "malloc error: ");
                           
                    exit(1);
                        }
                        q->front =
                    0;
                        q->rear =
                    0;
                        q->size = maxsize;
                    }

                    void Destroy_Queue(Queue *q)
                    {
                       
                    free(q->buf);
                    }

                    void Traverse_Queue(Queue *q)
                    {
                       
                    int i = q->front;

                       
                    while (i % q->size != q->rear) {        printf("buf[%d]: %d\n", i, q->buf[i]);
                            i++;
                        }
                    }

                    bool Queue_Empty(Queue *q)
                    {
                       
                    return (q->front == q->rear);
                    }

                    bool Queue_Full(Queue *q)
                    {
                       
                    return (q->front == ((q->rear + 1) % q->size));
                    }

                    bool EnQueue(Queue *q, char val)
                    {
                       
                    if (!Queue_Full(q)) {
                            *(q->buf + q->rear) = val;
                            q->rear = (q->rear +
                    1) % q->size;
                           
                    return true;
                        }
                       
                    printf("Queue Full!\n");
                       
                    return false;
                    }

                    bool DeQueue(Queue *q, char *val)
                    {
                       
                    if(!Queue_Empty(q)) {
                            *val = *(q->buf + q->front);
                            q->front = (q->front +
                    1) % q->size;
                           
                    return true;
                        }
                       
                    printf("Queue Empty!\n");
                       
                    return false;
                    }

                    void main()
                    {
                        Queue q;
                       
                    char a;

                        Init_Queue(&q,
                    6);

                       
                    printf("Input queue elements: \n");
                       
                    while(!Queue_Full(&q)) {
                           
                    scanf("%d", &a);
                            EnQueue(&q, a);
                        }

                       
                    printf("Traverse queue elements: \n");
                        Traverse_Queue(&q);

                       
                    printf("Delete queue elements: \n");
                       
                    while(!Queue_Empty(&q)) {
                            DeQueue(&q, &a);
                           
                    printf("%d\n", a);
                        }
                        Destroy_Queue(&q);
                    } 程序運行結果:
                    轉載自
                    https://blog.csdn.net/JAZZSOLDIER/article/details/52614273



                    2018年8月17日 22:16
                    ?瀏覽量:0
                    ?收藏
                    国产偷拍欧洲日韩亚洲 - 视频 - 在线观看 - 影视资讯 - 新赏网