有關(guān)“隊(duì)列”的總結(jié)

隊(duì)列

定義

一種可以實(shí)現(xiàn)“先進(jìn)先出”的存儲(chǔ)結(jié)構(gòu)皆疹。

分類

  1. 鏈?zhǔn)疥?duì)列 (用鏈表實(shí)現(xiàn))
圖
  1. 靜態(tài)隊(duì)列 (用數(shù)組實(shí)現(xiàn))

    圖

    靜態(tài)隊(duì)列通常都必須是循環(huán)隊(duì)列

    循環(huán)隊(duì)列的講解:

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

      減少空間的浪費(fèi)

    2. 循環(huán)隊(duì)列需要幾個(gè)參數(shù)來(lái)確定

      需要兩個(gè)參數(shù)來(lái)確定:

      1. front
      2. rear
    3. 循環(huán)隊(duì)列各個(gè)參數(shù)的含義

      2個(gè)參數(shù)不同場(chǎng)合有不同的含義

      1. 隊(duì)列初始化:front和rear的值都是零想括。

      2. 隊(duì)列非空:front代表的是隊(duì)列的第一個(gè)元素二驰,rear代表的是隊(duì)列的最后一個(gè)有效元素的下一個(gè)元素。

      3. 隊(duì)列為空:front和rear的值相等,但不定是零

    4. 循環(huán)隊(duì)列入隊(duì)偽算法講解

      1. 將值傳入r所代表的位置

      2. r = (r + 1) % 數(shù)組的長(zhǎng)度

    5. 循環(huán)隊(duì)列出隊(duì)偽算法講解

      f = (f + 1) % 數(shù)組的長(zhǎng)度

    6. 如何判斷循環(huán)隊(duì)列是否為空

      f == r的時(shí)候循環(huán)隊(duì)列為空

    7. 如何判斷循環(huán)隊(duì)列是否已滿

      1. 多增加一個(gè)標(biāo)識(shí)參數(shù)
      2. 少用一個(gè)元素[通常使用第這種方法]
      // 偽算法
      if( (r+1)%數(shù)組的長(zhǎng)度 == f )
          已滿
      else
          未滿
      

隊(duì)列算法

  1. 入隊(duì)

    
    int en_queue(Queue *q, int val)
    {
        if (is_full(q)) {
            return 0;
        } else {
            q->pBase[q->rear] = val;
            
            // 入隊(duì),rear加1
            q->rear = (q->rear + 1) % kQueue_len;
            
            return 1;
        }
    }
    
    
  2. 出隊(duì)

    int out_queue(Queue *q, int *pVal)
    {
        if (is_empty_queue(q)) {
            return 0;
        }
        
        *pVal = q->pBase[q->front];
        
        // 出隊(duì),front加1
        q->front = (q->front + 1)  % kQueue_len;
        
        return 1;
    }
    

隊(duì)列的具體應(yīng)用

所有和時(shí)間有關(guān)的操作都有隊(duì)列的影子

Example 1

以下是一個(gè)循環(huán)隊(duì)列的具體代碼實(shí)現(xiàn)的例子:


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

// 定義隊(duì)列的長(zhǎng)度
static const int kQueue_len = 6;

// 定義隊(duì)列的結(jié)構(gòu)體
typedef struct Queue {
    int *pBase;
    int front;
    int rear;
} Queue;

// 初始化
void init(Queue *, int);

// 入隊(duì)
int en_queue(Queue *, int);

// 出隊(duì)
int out_queue(Queue *, int *);

// 遍歷
void traverse_queue(Queue *);

// 判斷隊(duì)列是否已滿
int is_full(Queue *);

// 判斷隊(duì)列是否為空
int is_empty_queue(Queue *q);

int main(void)
{
    Queue q = {0};
    init(&q, kQueue_len);
    en_queue(&q, 1);
    en_queue(&q, 2);
    en_queue(&q, 3);
    en_queue(&q, 4);
    en_queue(&q, 5);
    en_queue(&q, 6);
    en_queue(&q, 7);
    en_queue(&q, 8);
    traverse_queue(&q);
    
    int pVal;
    
    if (out_queue(&q, &pVal)) {
        printf("出隊(duì)成功昼窗,隊(duì)列出隊(duì)元素是%d\n", pVal);
    } else {
        printf("出隊(duì)失敗涛舍!\n");
    }
    
    traverse_queue(&q);
    
    return 0;
}

void init(Queue *q, int len)
{
    q->pBase = (int *)malloc(sizeof(int) * len);
    q->front = 0;
    q->rear = 0;
}

int en_queue(Queue *q, int val)
{
    if (is_full(q)) {
        return 0;
    } else {
        q->pBase[q->rear] = val;
        
        // 入隊(duì)澄惊,rear加1
        q->rear = (q->rear + 1) % kQueue_len;
        
        return 1;
    }
}

int out_queue(Queue *q, int *pVal)
{
    if (is_empty_queue(q)) {
        return 0;
    }
    
    *pVal = q->pBase[q->front];
    
    // 出隊(duì),front加1
    q->front = (q->front + 1)  % kQueue_len;
    
    return 1;
}

int is_full(Queue *q)
{
    // rear緊挨著front一個(gè)元素的之間距的時(shí)候富雅,隊(duì)列就滿了
    if (((q->rear + 1) % kQueue_len) == q->front) {
        return 1;
    }
    
    return 0;
}

int is_empty_queue(Queue *q)
{
    // 只要front等于rear掸驱,隊(duì)列就為空
    if (q->front == q->rear) {
        return 1;
    }
    return 0;
}

void traverse_queue(Queue *q)
{
    int i = q->front;
    
    while (i != q->rear) {
        printf("%d\t", q->pBase[i]);
        
        // front位置不斷加1取余鏈表長(zhǎng)度,等于rear的時(shí)候没佑,遍歷完畢
        i = (i+1) % kQueue_len;
    }
    
    printf("\n");
}

代碼在Github這里code_01

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毕贼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛤奢,更是在濱河造成了極大的恐慌鬼癣,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啤贩,死亡現(xiàn)場(chǎng)離奇詭異待秃,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)痹屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門章郁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人志衍,你說(shuō)我怎么就攤上這事暖庄×奶妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵雄驹,是天一觀的道長(zhǎng)佃牛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)医舆,這世上最難降的妖魔是什么俘侠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮蔬将,結(jié)果婚禮上爷速,老公的妹妹穿的比我還像新娘。我一直安慰自己霞怀,他們只是感情好惫东,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著毙石,像睡著了一般廉沮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徐矩,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天滞时,我揣著相機(jī)與錄音,去河邊找鬼滤灯。 笑死坪稽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鳞骤。 我是一名探鬼主播窒百,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼豫尽!你這毒婦竟也來(lái)了篙梢?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤美旧,失蹤者是張志新(化名)和其女友劉穎渤滞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體陈症,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年震糖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了录肯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吊说,死狀恐怖论咏,靈堂內(nèi)的尸體忽然破棺而出优炬,到底是詐尸還是另有隱情,我是刑警寧澤厅贪,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布蠢护,位于F島的核電站,受9級(jí)特大地震影響养涮,放射性物質(zhì)發(fā)生泄漏葵硕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一贯吓、第九天 我趴在偏房一處隱蔽的房頂上張望懈凹。 院中可真熱鬧,春花似錦悄谐、人聲如沸介评。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)们陆。三九已至,卻和暖如春情屹,著一層夾襖步出監(jiān)牢的瞬間坪仇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工屁商, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烟很,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓蜡镶,卻偏偏與公主長(zhǎng)得像雾袱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子官还,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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

  • 本文主要講解了隊(duì)列的定義和隊(duì)列主要功能實(shí)現(xiàn)的算法芹橡。最后會(huì)列舉一些隊(duì)列在程序設(shè)計(jì)當(dāng)中常見(jiàn)的應(yīng)用實(shí)例!相信了解了隊(duì)列對(duì)...
    xiaoyouPrince閱讀 1,021評(píng)論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)望伦。 張土汪:刷leetcod...
    土汪閱讀 12,740評(píng)論 0 33
  • 隊(duì)列是只允許在一端進(jìn)行插入操作林说,而在另一端進(jìn)行刪除操作的線性表。(先進(jìn)先出) 隊(duì)列的鏈試存儲(chǔ)結(jié)構(gòu) 隊(duì)列既可以用鏈表...
    AceKitty閱讀 343評(píng)論 1 1
  • 程序 #include #include<malloc.h>#include<windows.h> #define...
    Doloresxxxx閱讀 251評(píng)論 0 0
  • #include #include<malloc.h>#include<windows.h> #define Ma...
    TDKDPIKA閱讀 182評(píng)論 0 0