【我的漫漫考研路】數據結構之隊列的線性實現

正文之前

最近在家流年不利,先是昨天家里路由器還是ADSL調制解調器壞了。反正是沒網了!然后,今天上午還停電了,昨晚因為熬夜寫碼,所以忘了給手機充電了。早上起來9%的電量,讓我怎么活?!沒網沒電!我輩程序員能忍?!!好吧,不能忍又咋地,乖乖看數學~

話說昨晚!數學看到三重積分實在看不下去了!而且網絡斷了基本只能躺床上裝咸魚。索性不如寫會碼,所以就把隊列這個數據結構給實現了,還好還好~~~下面是調完BUG后看了時間的我

正文




#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE  5
//注:定義隊列結構體及其指針
typedef struct Queue
{
    int Data[MAXSIZE];
    int  front;
    int  rear;
    
} Queue, *PtrQ;


//注:初始化隊列函數,傳入一個表頭,之后申請內存,使之成為靜態變量

PtrQ InitQueue(PtrQ ptrq)
{
    Queue *ptrQ;
    ptrQ=(Queue *)malloc(MAXSIZE*sizeof(Queue));
    //注:初始尾指針,頭指針指向-1,每次只要成為空隊列就重新置-1,確保空隊列有區別于其他的情況
    ptrQ->front=-1;
    ptrQ->rear=-1;
    //注:將初始化后的線性表隊列傳回
    return ptrQ;
}



//注:插入數值函數,先預判需要插入的地方是否合法
void Putin(PtrQ ptrQ,int item)
{
    if ( (ptrQ->rear + 1)%MAXSIZE == ptrQ->front )
    {        /* 空間已滿,不能插入*/
        printf("隊列空間已滿,不能插入\n\n");
        
    }
    else
    {
        if ( ptrQ->rear==ptrQ->front&&ptrQ->front==-1 )
        {
            /*檢查插入的時候是否為第一次插入*/
            printf("\n人家剛剛還是空隊列呢,現在被你插入了~~\n");
        }
        //注:插入后,要對隊列中的尾指針做改變,向前進一位,
        ptrQ->Data[++ptrQ->rear]=item;
        //注:此時如果是第一次插入數值,那么頭指針也要跟著跑一下!
        if (ptrQ->front==-1) ptrQ->front=0;
        // 注:如果尾指針已經到了最后一位,那么再次插入數值就要回到0位
        if (ptrQ->rear==MAXSIZE)  ptrQ->rear=0;
        printf("成功插入!尾巴是:%d\t腦袋是:%d\n\n",ptrQ->rear,ptrQ->front);
    }
}


//注:拋出數值函數,先預判是否合法,拋出后頭指針向前走1位
int Putout(PtrQ ptrQ)
{
    int out;
    if ( ptrQ->front ==-1 )
    {
        /*檢查插入位置的合法性*/
        printf("\n當前還是空隊列呢,沒東西了!\n\n");
        return 0;
    }
    else if(ptrQ->front==ptrQ->rear)
    { //注:如果只剩下一個數值,那么拋出之后就成為空列表,就要回歸-1位,方便調用
        out=ptrQ->Data[ptrQ->front];
        printf("\n我空了,彈盡糧絕 最后的子彈: %d\t\n",out);
        ptrQ->front =-1;
        ptrQ->rear =-1;
        printf("成功拋出!尾巴是:%d\t腦袋是:%d\n\n",ptrQ->rear,ptrQ->front);
        return out;
    }
    //注:如果是正常情況,也就是說拋出前還有超過一個元素,可以分為頭指針小于尾指針和大于尾指針兩種情況
    //注:另外還有就是如果頭指針已經指到最后一個位置,那么拋出后頭指針置0
    else if (ptrQ->front==MAXSIZE-1)
        //注:
    {
        out=ptrQ->Data[ptrQ->front++];
        ptrQ->front=0;
        printf("\n被拋出來:\t%d \n",out);
        printf("成功拋出!尾巴是:%d\t腦袋是:%d\n\n",ptrQ->rear,ptrQ->front);
        return out;
    }
    //頭指針不指向最后一個位置,那么直接輸出,頭指針加1就好了
    else
    {
        out=ptrQ->Data[ptrQ->front];
        ptrQ->front++;
        printf("\n被拋出來:\t%d \n",out);
        printf("成功拋出!尾巴是:%d\t腦袋是:%d\n\n",ptrQ->rear,ptrQ->front);
        return out;
    }
}



//注:遍歷函數,簡單易懂,不過分為三種情況 1.空隊列  2.頭指針小于尾指針  3.頭指針大于尾指針
void ShowQueue(PtrQ ptrq)
{
    printf("\n******遍歷的量是:******\n");
    //注:空隊列
    if ( ptrq->front ==-1 )
    {
        /*檢查插入位置的合法性*/
        printf("\n當前還是空隊列呢,沒東西給你遍歷了!\n\n");
        exit(-1);
    }
    //非空隊列
    int i=ptrq->front,j=ptrq->rear;
   //注:頭指針在尾指針之前,也就是說直接自增頭指針知道等于尾指針即可
    if (i<=j)
    {
        for (;i<=j; i++)
        {
            printf("%d\t????加油啊!????\n",ptrq->Data[i]);
        }
    }
    //注:頭指針在尾指針后面,那么就需要頭指針有個回0的過程,回0之后等同于上面的小于的情況
    else
    {
        while(i!=MAXSIZE)
        {
            printf("%d\n",ptrq->Data[i]);
            i++;
        }
        i=0;
        for (;i<=j; i++)
        {
            printf("%d\n ????加油啊!????\n",ptrq->Data[i]);
        }
    }
    printf("******遍歷完成!******\n\n");
}


int main()
{
    PtrQ ptrq;
    ptrq=InitQueue(ptrq);
    Putin(ptrq,5);
    Putin(ptrq,3);
    ShowQueue(ptrq);
    Putin(ptrq,38);
    Putin(ptrq,66);
    Putin(ptrq,69);
    Putin(ptrq,88);
    ShowQueue(ptrq);
    Putout(ptrq);
    printf("\n ------------------\n| \tfuck off \t |\n ------------------\n" );
    ShowQueue(ptrq);
    Putout(ptrq);
    ShowQueue(ptrq);
    Putout(ptrq);
    Putout(ptrq);
    Putout(ptrq);
    Putout(ptrq);
    ShowQueue(ptrq);
    return 0;
}

阿西吧,現在真是越來越6了!我的小妹子估計現在在睡覺,我就不去打擾她了。粘人又可愛的小妹子啊!~ ~ ~ ~ Yeah ~ ~

運行結果:



人家剛剛還是空隊列呢,現在被你插入了~~
成功插入!尾巴是:0  腦袋是:0

成功插入!尾巴是:1  腦袋是:0


******遍歷的量是:******
5    加油啊!??
3    加油啊!??
******遍歷完成!******

成功插入!尾巴是:2  腦袋是:0

成功插入!尾巴是:3  腦袋是:0

成功插入!尾巴是:4  腦袋是:0

隊列空間已滿,不能插入


******遍歷的量是:******
5    加油啊!??
3    加油啊!??
38   加油啊!??
66   加油啊!??
69   加油啊!??
******遍歷完成!******


被拋出來:   5 
成功拋出!尾巴是:4  腦袋是:1


 ------------------
|   fuck off     |
 ------------------

******遍歷的量是:******
3    加油啊!??
38   加油啊!??
66   加油啊!??
69   加油啊!??
******遍歷完成!******


被拋出來:   3 
成功拋出!尾巴是:4  腦袋是:2


******遍歷的量是:******
38   加油啊!??
66   加油啊!??
69   加油啊!??
******遍歷完成!******


被拋出來:   38 
成功拋出!尾巴是:4  腦袋是:3


被拋出來:   66 
成功拋出!尾巴是:4  腦袋是:4


我空了,彈盡糧絕 最后的子彈: 69  
成功拋出!尾巴是:-1 腦袋是:-1


當前還是空隊列呢,沒東西了!

Program ended with exit code: 0

如下為圖解(并非完全按照上述程序來的,要細看程序可以拷貝程序打斷點,或者是看我的運行結果):

初始化,也就是創建隊列

注意,此處的初始化的意思是給第一個值!不小心表述錯誤

再次給定數值入隊

繼續入隊

第一次出隊

正文之后

父親大人今天回來了,免不了還是對我一陣嘮叨,不過過幾天就要去學校了,還是對我爸爸多關注點吧!雖然他并不能理解我的很多行為,但是怎么說都是我親爸,養我到這么大,做兒子也只是希望他們生活的開心點,不要為我操太多心啊!家家有本難念的經!

單步運行之后是不是直觀多了?
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容