數(shù)據(jù)結(jié)構(gòu)----靜態(tài)隊列(循環(huán)隊列)

靜態(tài)循環(huán)隊列幾個問題

1.靜態(tài)隊列為什么必須是循環(huán)隊列?

因為不管是入隊還是出隊,front和rear都是增長的,靜態(tài)隊列使用的是數(shù)組來存放入隊的數(shù)據(jù),由于front和rear都是增長的,那么后方就會騰出空余的空間,為了重復(fù)利用,只能將front和rear增長到數(shù)組的末尾的時候,將值重新設(shè)置為數(shù)組第一個元素的位置.

2.循環(huán)隊列需要幾個參數(shù)來確定?

首先定義一個循環(huán)隊列的結(jié)構(gòu)體

typedef struct{
    int length;
    int * a;
    int r;//隊尾,入隊數(shù)據(jù)向隊尾添加
    int f;//隊頭,出隊從隊頭出隊
    int isFlag;//標(biāo)記這個隊列是否已滿,0表示為空隊列,1表示未滿,2表示已滿
}LoopQueue,*PLoopQueue;

3.循環(huán)隊列的各個參數(shù)的含義?

  • length 隊列最多能同時入隊的元素有多少個(隊列的大小)
  • a 指向一個指定大小的數(shù)組(通過malloc分配的一個length大小的數(shù)組)
  • r 循環(huán)隊列的隊尾(入隊的地方)
  • f 循環(huán)隊列的隊頭(出隊的地方)
  • isFlag 標(biāo)記當(dāng)前循環(huán)隊列的:EMPTY(空),UNDER(不為空也沒滿),FULL(已滿)

4.初始化隊列

  • 創(chuàng)建一個LoopQueue結(jié)構(gòu)體變量
  • 申請 length*sizeof(int) 的空間,并賦值給a
  • 將r,f都設(shè)置成0
  • 將isFlag設(shè)置成EMPTY

5.循環(huán)隊列入隊偽算法?

  • 判滿(因為是入隊,當(dāng)隊滿的時候,無法再繼續(xù)入隊)
    • return false
  • 否則隊列未滿,執(zhí)行入隊操作
    • 將val賦值給數(shù)組位置為r的空間
    • 將r加一并與length取余(這樣就能非常簡單的實現(xiàn)循環(huán))的結(jié)果賦值給r
    • 判斷隊列的狀態(tài)
      • 如果r == f(隊頭隊尾在數(shù)組同一位置了,由于是入隊操作導(dǎo)致r == f,所以只能是隊已滿),此時說明隊列已滿 isFlag 設(shè)置為 Full
      • 否則 isFlag 設(shè)置為 UNDER(因為剛?cè)腙犚粋€元素,肯定不能是EMPTY)
    • return true

6.循環(huán)隊列出隊偽算法?

  • 判空(因為是出隊,當(dāng)隊列為空的時候,出隊失敗)
    • return false
  • 否則不為空,執(zhí)行出隊操作
    • 將數(shù)組f位置的空間的值賦值給 *val
    • 將f加一并與length取余的結(jié)果賦值給f
    • 判斷隊列的狀態(tài)
      • 如果f==r(此時是出隊操作,只有可能是隊列為空了),說明隊列為空,將isFlag設(shè)置為EMPTY
      • 否則設(shè)置為UNDER,因為剛出隊一個,不可能此時是 Full 了
    • return true

程序?qū)崿F(xiàn)

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

#define EMPTY 0
#define UNDER 1
#define FULL 2

/**
 * 循環(huán)隊列
 */

typedef struct{
    int length;
    int * a;
    int r;//隊尾,入隊數(shù)據(jù)向隊尾添加
    int f;//隊頭,出隊從隊頭出隊
    int isFlag;//標(biāo)記這個隊列是否已滿,0表示為空隊列,1表示未滿,2表示已滿
}LoopQueue,*PLoopQueue;

/**
 * 創(chuàng)建一個循環(huán)隊列,默認(rèn)大小是5
 * @param  length [description]
 * @return        [description]
 */
LoopQueue createLoopQueue(int length){
    LoopQueue l;

    if (length<5){
        length=5;
    }
    
    l.length=length;
    l.a=(int *)malloc(length*sizeof(int));
    l.r=0;
    l.f=0;
    l.isFlag=EMPTY;
    return l;
}

/**
 * 入隊,入隊成功返回1,失敗返回0
 * @param  pL  [description]
 * @param  val [description]
 * @return     [description]
 */
int enqueue(PLoopQueue pL,int val){
    if (pL->isFlag == FULL){
        //隊列已滿,無法再添加數(shù)據(jù)
        return 0;
    }else{
        //否則的話就將當(dāng)前a數(shù)組的r所對應(yīng)的位置用來存儲值
        (pL->a)[pL->r]=val;
        //r的位置向前移動一次
        //被坑的最慘的一次,后加加,使用之后加,在這兒必須使用前 pL->r + 1 
        pL->r = (pL->r + 1 ) % (pL->length);

        //判斷當(dāng)前這個循環(huán)隊列的狀態(tài),因為是如隊,所以接下來添加一個元素的可能狀態(tài)是,UNDER(未滿),或者是FULL(滿)
        if (pL->r==pL->f){
            //說明此時的隊列已經(jīng)裝滿了
            pL->isFlag = FULL;
        }else{
            //說明此時的隊列還沒有裝滿
            pL->isFlag = UNDER;
        }
        return 1;
    }
}

/**
 * 出隊
 * @param  pL  [description]
 * @param  val [description]
 * @return     [description]
 */
int dequeue(PLoopQueue pL,int * val){
    if (pL->isFlag==EMPTY){
        //隊列為空,無法再出隊
        return 0;
    }else{
        //取值
        *val=pL->a[pL->f];
        //將值清除
        pL->a[pL->f]=0;
        //f向前移動
        pL->f =( pL->f + 1 ) % pL->length;

        //判斷當(dāng)前這個循環(huán)隊列的狀態(tài),因為是出隊,所以接下來移除一個元素的可能狀態(tài)是,UNDER(未滿),或者是EMPTY(空)
        if (pL->f == pL->r){
            //此時全部出隊了,當(dāng)前的隊列為空
            pL->isFlag = EMPTY;
        }else{
            pL->isFlag = UNDER;
        }
        return 1;
    }
}

int main(){
    LoopQueue loopQueue=createLoopQueue(50);

    int i,flag;
    int temp;

    for(i=0;i<60;i++){
        flag=enqueue(&loopQueue,i);
        if(flag){
            printf("入隊%d\n", i);
        }else{
            printf("隊列已滿\n");
        }
    }

    while(dequeue(&loopQueue,&temp)){
        printf("出隊%d\n", temp);
    }

    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市擎颖,隨后出現(xiàn)的幾起案子榛斯,更是在濱河造成了極大的恐慌,老刑警劉巖搂捧,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驮俗,死亡現(xiàn)場離奇詭異,居然都是意外死亡允跑,警方通過查閱死者的電腦和手機(jī)王凑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聋丝,“玉大人索烹,你說我怎么就攤上這事∪跄溃” “怎么了百姓?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長况木。 經(jīng)常有香客問我垒拢,道長,這世上最難降的妖魔是什么焦读? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任子库,我火速辦了婚禮舱权,結(jié)果婚禮上矗晃,老公的妹妹穿的比我還像新娘。我一直安慰自己宴倍,他們只是感情好张症,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸵贬,像睡著了一般俗他。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阔逼,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天兆衅,我揣著相機(jī)與錄音,去河邊找鬼。 笑死羡亩,一個胖子當(dāng)著我的面吹牛摩疑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畏铆,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼雷袋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辞居?” 一聲冷哼從身側(cè)響起楷怒,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓦灶,沒想到半個月后鸠删,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贼陶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年冶共,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片每界。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡捅僵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出眨层,到底是詐尸還是另有隱情庙楚,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布趴樱,位于F島的核電站馒闷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏叁征。R本人自食惡果不足惜纳账,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捺疼。 院中可真熱鬧疏虫,春花似錦、人聲如沸啤呼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽官扣。三九已至翅敌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惕蹄,已是汗流浹背蚯涮。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工治专, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遭顶。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓看靠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親液肌。 傳聞我的和親對象是個殘疾皇子挟炬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容