隊列

隊列的基本概念

1 隊列的定義

隊列(Queue):隊列簡稱隊霹娄,也是一種操作受限的線性表翎苫,只允許在表的一端進行插入兔院,而在表的另一端進行刪除姿鸿。向隊列中插入元素稱為入隊或進隊谆吴;刪除元素稱為出隊或離隊。其操作的特性是先進先出(First In First Out,FIFO)苛预,故又稱為先進先出的線性表纪铺。
隊頭(Front):允許刪除的一端,又稱為隊首碟渺。
隊尾(Rear):允許插入的一端鲜锚。
空隊列:不含任何元素的空表。

2 隊列常見的基本操作

InitQueue(&Q):初始化隊列苫拍,構(gòu)造一個空隊列Q芜繁。
QueueEmpty(Q):判隊列空,若隊列Q為空返回true绒极,否則返回false骏令。
EnQueue(&Q,x):入隊,若隊列Q未滿垄提,將x加入榔袋,使之稱為新的隊尾。
DeQueue(&Q,&x):出隊铡俐,若隊列Q非空凰兑,刪除隊頭元素,并用x返回审丘。
GetHead(Q,&x):讀隊頭元素吏够,若隊列Q非空,則將隊頭元素賦值給x滩报。

3 隊列的順序存儲結(jié)構(gòu)

1.隊列的順序存儲
隊列的順序?qū)崿F(xiàn)是指分配一塊連續(xù)的存儲單元存放隊列中的元素锅知,并附設(shè)兩個指針front和rear分別指示隊頭元素和隊尾元素的位置。設(shè)隊頭指針指向隊頭元素脓钾,隊尾指針指向隊尾元素的下一個位置售睹。
隊列的順序存儲類型可描述為

typedef struct {
    ElemType data[MAXSIZE];
    int front, rear;
} SqQueue;

初始狀態(tài)(隊空條件):Q.front == Q.rear == 0
進隊操作:隊不滿時,先送值到隊尾元素可训,再將隊尾指針加1
出隊操作:隊不空時昌妹,先取隊頭元素的值生真,再將隊頭指針加1

2.循環(huán)隊列
將順序隊列臆造為一個環(huán)狀的空間,即把存儲隊列元素的表從邏輯上看成一個環(huán)捺宗,稱為循環(huán)隊列柱蟀。當(dāng)隊首指針Q.front = MaxSize - 1后,再前進一個位置就自動到0蚜厉,這可以利用除法取余運算(%)來實現(xiàn)长已。
初始時:Q.front == Q.rear == 0
隊首指針進1:Q.front = (Q.front + 1) % MaxSize
隊尾指針進1:Q.rear = (Q.rear + 1) % MaxSize
隊列長度:(Q.rear + MaxSize - Q.front) % MaxSize
出隊入隊時:指針都按順時針方向進1

為了區(qū)分隊空還是隊滿的情況,有三種處理方式:
1)犧牲一個單元來區(qū)分隊空和隊滿昼牛,入隊時少用一個隊列單元术瓮,這是一種較為普遍的做法,約定“隊頭指針在隊尾指針的下一位置作為隊滿的標(biāo)志”贰健。
隊滿條件為:(Q.rear + 1) % MaxSize == Q.front
隊空條件仍為:Q.front == Q.rear
隊列中元素的個數(shù):(Q.rear - Q.front + MaxSize) % MaxSize

2)類型中增設(shè)表示元素個數(shù)的數(shù)據(jù)成員胞四。這樣,則隊空的條件為Q.size == 0伶椿;隊滿的條件為Q.size -- MaxSize辜伟。這兩種情況都有Q.front == Q.rear。

3)類型中增設(shè)tag數(shù)據(jù)成員脊另,以區(qū)分是隊滿還是隊空导狡。tag等于0的情況下,若因刪除導(dǎo)致Q.front == Q.rear則為隊空偎痛;tag等于1的情況下旱捧,若因插入導(dǎo)致Q.front == Q.rear則為隊滿。

3.循環(huán)隊列的操作
1)初始化

void InitQueue(SqQueue *Q) {
    Q->rear = Q->front = 0;
}
2)判隊空
int isEmpty(SqQueue *Q) {
    if (Q->rear == Q->front) {
        return 1;
    } else {
        return 0;
    }
}

3)入隊

int EnQueue(SqQueue *Q, ElemType x) {
//隊滿
    if ((Q->rear + 1) % MAXSIZE == Q->front) {
        return 0;
    }
    Q->data[Q->rear] = x;
    Q->rear = (Q->rear + 1) % MAXSIZE;
    return 1;
}

4)出隊

int DeQueue(SqQueue *Q, ElemType x) {
    if (Q->rear == Q->front) {
        return 0;
    }
    x = Q->data[Q->front];
    Q->front = (Q->front + 1) % MAXSIZE;
    return 1;
}

4 隊列的鏈?zhǔn)酱鎯Y(jié)構(gòu)

1.隊列的鏈?zhǔn)酱鎯?br> 隊列的鏈?zhǔn)奖硎痉Q為鏈隊列踩麦,它實際上是一個同時帶有隊頭指針和隊尾指針的單鏈表枚赡。頭指針指向頭結(jié)點,尾指針指向尾結(jié)點谓谦,即單鏈表的最后一個結(jié)點(注意與順序存儲的不同)贫橙。
隊列的鏈?zhǔn)酱鎯擅枋鰹?/p>

typedef struct {
    ElemType data;
    struct LinkNode *next;
} LinkNode;

typedef struct {
    LinkNode *front, *rear;
} LinkQueue;

當(dāng)Q.front == NULL且Q.rear == NULL時,鏈?zhǔn)疥犃袨榭铡?br> 通常將鏈?zhǔn)疥犃性O(shè)計成一個帶頭結(jié)點的單鏈表茁计,這樣插入和刪除操作就統(tǒng)一了料皇。

2.鏈?zhǔn)疥犃械幕静僮?br> 1)初始化

void InitQueue(LinkQueue *Q) {
    //建立頭結(jié)點
    Q->front = Q->rear = (LinkNode *) malloc(sizeof(LinkNode));
    //初始為空
    Q->front->next = NULL;
}

2)判隊空

int IsEmpty(LinkQueue *Q) {
    if (Q->front == Q->rear) {
        return 1;
    } else {
        return 0;
    }
}

3)入隊

void EnQueue(LinkQueue *Q,ElemType x) {
      LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
      s->data = x;
      s->next = NULL;
      Q->rear->next = s;
      Q->rear = s;
}

4)出隊

int DeQueue(LinkQueue *Q, ElemType *x) {
    if (Q->front == Q->rear) {
        return ERROR;
    }
    LinkNode *p = Q->front;
    *x = p->data;
    Q->front->next = p->next;
    if (Q->rear == Q->front) {
        Q->rear = Q->front;
    }
    free(p);
    return OK;
}

5 雙端隊列

雙端隊列是指允許兩端都可以進行入隊和出隊操作的隊列谓松。其元素的邏輯仍是線性結(jié)構(gòu)星压。將隊列的兩端分別稱為前端和后端,兩端都可以入隊和出隊鬼譬。



在雙端隊列進隊時:前端進的元素排列在隊列中后端進的元素的前面娜膘,后端進的元素排列在隊列中前端進的元素的后面。
在雙端隊列出隊時:無論前端還是后端出隊优质,先出的元素排列在后出的元素的前面竣贪。
輸出受限的雙端隊列:允許在一端插入和刪除军洼,但在另一端只允許插入的雙端隊列稱為輸出受限的雙端隊列。



輸入受限的雙端隊列:允許在一端進行插入和刪除演怎,但在另一端只允許刪除的雙端隊列稱為輸入受限的雙端隊列而如果限定雙端隊列從某個端點插入的元素只能從該端點刪除匕争,則該雙端隊列就蛻變?yōu)閮蓚€棧底相鄰接的棧了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爷耀,一起剝皮案震驚了整個濱河市甘桑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歹叮,老刑警劉巖跑杭,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咆耿,居然都是意外死亡德谅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門萨螺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窄做,“玉大人,你說我怎么就攤上這事慰技〗撸” “怎么了总滩?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵半夷,是天一觀的道長起意。 經(jīng)常有香客問我曹抬,道長邑雅,這世上最難降的妖魔是什么黄锤? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任肠缨,我火速辦了婚禮佩憾,結(jié)果婚禮上掩蛤,老公的妹妹穿的比我還像新娘枉昏。我一直安慰自己,他們只是感情好揍鸟,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布兄裂。 她就那樣靜靜地躺著,像睡著了一般阳藻。 火紅的嫁衣襯著肌膚如雪晰奖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天腥泥,我揣著相機與錄音匾南,去河邊找鬼。 笑死蛔外,一個胖子當(dāng)著我的面吹牛蛆楞,可吹牛的內(nèi)容都是我干的溯乒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼豹爹,長吁一口氣:“原來是場噩夢啊……” “哼裆悄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起臂聋,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤灯帮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逻住,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钟哥,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年瞎访,在試婚紗的時候發(fā)現(xiàn)自己被綠了腻贰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡扒秸,死狀恐怖播演,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伴奥,我是刑警寧澤写烤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站拾徙,受9級特大地震影響洲炊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尼啡,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一暂衡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崖瞭,春花似錦狂巢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雌续,卻和暖如春斩个,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背西雀。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工萨驶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艇肴。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓腔呜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親再悼。 傳聞我的和親對象是個殘疾皇子核畴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 數(shù)據(jù)結(jié)構(gòu) 第7講 循環(huán)隊列 過了一段時間,小張再也受不了...
    rainchxy閱讀 8,994評論 4 16
  • 注:不足及錯誤請指正 +qq1366963396討論 隊列(queue)是只允許在一端進行插入操作冲九,而在另一端進行...
    lxr_閱讀 876評論 0 0
  • C語言是面向過程的莺奸,而C++是面向?qū)ο蟮?C和C++的區(qū)別: C是一個結(jié)構(gòu)化語言丑孩,它的重點在于算法和數(shù)據(jù)結(jié)構(gòu)。C程...
    小辰帶你看世界閱讀 1,834評論 0 1
  • 隊列是只允許在一端進行插入操作灭贷,而在另一端進行刪除操作的線性表温学。(先進先出) 隊列的鏈試存儲結(jié)構(gòu) 隊列既可以用鏈表...
    AceKitty閱讀 346評論 1 1
  • /***************利用數(shù)組模擬循環(huán)隊列***************/ #include "stdi...
    HanMeng閱讀 735評論 0 0