數據結構:隊列

1.定義算法

  能夠實現「先進先出」的存儲結構數組

2. 分類post

  鏈式隊列        ——用鏈表實現spa

    只容許在鏈表的頭部刪除,鏈表的尾部增長,就是隊列指針

  靜態隊列(數組隊列)  ——用數組實現blog

    靜態隊列一般都必須是循環隊列隊列

    循環隊列的講解:it

      1.靜態隊列爲何必須是循環隊列io

      2.循環隊列須要幾個參數來肯定循環

        須要2個參數來肯定

          front

          rear

      3.循環隊列各個參數的含義

        2個參數不一樣場合有不一樣的含義

        1)隊列初始化

          front和rear的值都是零

        2)隊列非空

          front表明隊列的第一個元素

          rear表明的隊列的最後一個有效元素的下一個元素

        3)隊列空

          front和rear的值相等,可是不必定是零(front++,front=rear,隊列爲空)

      4.循環隊列入隊僞算法講解

          r移動

        1) 將值存入r所表明的位置

        2) 對於r 

          錯誤寫法 r = r + 1

          正確寫法 r = (r+1)%數組長度,解決了當r=5的時候的循環問題

      5.循環隊列出隊僞算法講解

          f移動

          f  = (f + 1)%數組長度  (數組長度對於下表的話爲6)

      6.如何判斷循環隊列是否爲空

          若是front與rear的值相等,則該隊列必定爲空

      7.如何判斷循環隊列是否已滿

         兩種方式

          1)多增長一個標誌參數

          2)若是r和f緊挨着,則隊列已滿(至關於浪費一個元素的位置)

 

            至關於當4的位置上填入s以後,r移動到5的位置,5的位置不填值,已滿

              if ((r+1)%數組長度 == f)

                已滿

             else

                不滿

//原則:通常來講無論是鏈表仍是隊列,頭指向頭個有實質意義結點,則尾部爲尾部結點指向的下一個結點,反之相同

3.

當要刪除中的時候,指針front直接循環回去,不指向「中」,rear指針向下移動一位便可

 

3.隊列的基本應用

   全部和時間相關的操做都與隊列有關

 

代碼實現:

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <stdbool.h>typedef struct Queue{    int * pBase;    int front;    int rear;}QUEUE;void init(QUEUE *);bool en_queue(QUEUE *, int val);void traverse_queue(QUEUE *);bool full_queue(QUEUE *);bool out_queue(QUEUE *, int * );bool empty_queue(QUEUE * );int main(){    QUEUE Q;    int val;    init(&Q);    en_queue(&Q, 1);https://i.cnblogs.com/posts    en_queue(&Q, 2);    en_queue(&Q, 3);    en_queue(&Q, 4);    en_queue(&Q, 5);    en_queue(&Q, 6);    traverse_queue(&Q);            if (out_queue(&Q, &val))    {        printf("出隊成功,出隊成功的元素是:%d\n", val);    }    else    {        printf("出隊失敗\n");    }    traverse_queue(&Q);    return 0;}void init(QUEUE *pQ){    pQ->pBase = (int *)malloc(sizeof(int) * 6);    pQ->front = 0;    pQ->rear = 0;}bool full_queue(QUEUE *pQ){    if ((pQ->rear + 1) % 6 == pQ->front)    {        return true;    }    else    {        return false;    }}bool en_queue(QUEUE *pQ, int val){    if (full_queue(pQ))    {        return false;    }    else    {        pQ->pBase[pQ->rear] = val;        pQ->rear = (pQ->rear+1) % 6;        return true;    }}void traverse_queue(QUEUE * pQ){    int i = pQ->front;    while(i != pQ->rear)    {        printf("%d ", pQ->pBase[i]);        i = (i+1) % 6;    }    return;}bool empty_queue(QUEUE * pQ){    if (pQ->front == pQ->rear)    {        return true;    }    else    {        return false;    }}bool out_queue(QUEUE *pQ, int * pVal){    if (empty_queue(pQ))    {        return false;    }    else    {        *pVal = pQ->pBase[pQ->front];        pQ->front = (pQ->front + 1) % 6;        return true;    }}

相關文章
相關標籤/搜索