大師兄的數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記(三):隊(duì)列

大師兄的數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記(二):線性結(jié)構(gòu)
大師兄的數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記(四):樹結(jié)構(gòu)

一鞭铆、什么是隊(duì)列(Queue)

  • 隊(duì)列是具有一定操作約束的線性表。
  • 只在一端(隊(duì)尾)插入/入隊(duì)列,在另一端(隊(duì)頭)刪除/出隊(duì)列。
  • 先入先出:First In First OUT (FIFO)。

二、隊(duì)列的抽象數(shù)據(jù)類型描述

  • 數(shù)據(jù)對象集: 一個(gè)有0個(gè)或多個(gè)元素的有窮線性表。
  • 操作集: 長度為MaxSize的隊(duì)列Q\in Queue,隊(duì)列元素item\in ElementType
操作 含義
Queue CreateQueue(int MaxSize) 生成長度為MaxSize的空隊(duì)列蜡娶。
int IsFull(Queue Q,int MaxSIze) 判斷隊(duì)列Q是否已滿。
void AddQ(Queue Q,ElementType item) 將數(shù)據(jù)元素item插入隊(duì)列Q中映穗。
int IsEmpty(Stack S) 判斷隊(duì)列Q是否為空窖张。
ElementType DeleteQ(Queue Q) 將隊(duì)頭數(shù)據(jù)元素從隊(duì)列中刪除并返回。

三蚁滋、隊(duì)列的順序存儲(chǔ)實(shí)現(xiàn)

  • 隊(duì)列的順序存儲(chǔ)通常由一個(gè)一維數(shù)組宿接、一個(gè)記錄隊(duì)列頭元素位置的變量front、一個(gè)記錄隊(duì)列尾元素位置的變量rear組成辕录。
#ifndef QUEUE_H
#define QUEUE_H
typedef int DataType;

const int MaxSize = 100;

class Queue
{
public:
    Queue() {};                             //生成長度為MaxSize的空隊(duì)列
    bool IsFull();      //判斷隊(duì)列Q是否已滿
    void AddQ(DataType item);   //將數(shù)據(jù)元素item插入隊(duì)列Q中
    bool IsEmpty();                 //判斷隊(duì)列Q是否為空
    DataType DeleteQ();             //將隊(duì)頭數(shù)據(jù)元素從隊(duì)列中刪除并返回
private:
    DataType data[MaxSize];
    int front;
    int rear;
};
#endif
#include <iostream>
#include "Queue.h"
using namespace std;

bool Queue::IsFull()
{
    //判斷隊(duì)列Q是否已滿
    if ((rear + 1) % MaxSize == front) {
        return true;
    }
    return false;
}

bool Queue::IsEmpty()
{
    //判斷隊(duì)列Q是否為空
    if (rear == front)
    {
        return true;
    }
    return false;
}

void Queue::AddQ(DataType item)
{
    //將數(shù)據(jù)元素item插入隊(duì)列Q中
    if (IsFull())
    {
        printf("Queue is full!");
        return;
    }
    rear = (rear + 1) % MaxSize;
    data[rear] = item;
}

DataType Queue::DeleteQ()
{
    //將隊(duì)頭數(shù)據(jù)元素從隊(duì)列中刪除并返回
    if (IsEmpty())
    {
        printf("Queue is empty!");
        return 0;
    }
    else {
        front = (front + 1) % MaxSize;
        return data[front];
    }
}

四睦霎、隊(duì)列的鏈?zhǔn)酱鎯?chǔ)實(shí)現(xiàn)

  • 用一個(gè)單鏈表實(shí)現(xiàn),鏈表頭作為front走诞,鏈表末尾作為rear副女。


#ifndef QUEUE_H
#define QUEUE_H
typedef int DataType;

typedef struct Node {
    //鏈表數(shù)據(jù)結(jié)構(gòu)
    DataType Data;
    struct Node *Next;
}QNode;

class Queue
{
public:
    Queue() {};                 //構(gòu)造函數(shù)
    void AddQ(DataType item);   //將數(shù)據(jù)元素item插入隊(duì)列Q中
    bool IsEmpty();             //判斷隊(duì)列Q是否為空
    DataType DeleteQ();         //將隊(duì)頭數(shù)據(jù)元素從隊(duì)列中刪除并返回
private:
    //鏈表隊(duì)列結(jié)構(gòu)
    QNode *front;
    QNode *rear;
};
#endif
#include <iostream>
#include "Queue.h"
using namespace std;

bool Queue::IsEmpty()
{
    //判斷隊(duì)列Q是否為空
    if (front==nullptr)
    {
        return true;
    }
    return false;
}

void Queue::AddQ(DataType item)
{
    //將數(shù)據(jù)元素item插入鏈表尾部
    QNode* RearCell = new QNode;
    RearCell->Data = item;
    RearCell->Next = nullptr;

    if (IsEmpty())
        rear = front = RearCell;
    else  
        rear->Next = RearCell;
        rear = RearCell;
}   

DataType Queue::DeleteQ()
{
    //將隊(duì)頭數(shù)據(jù)元素從隊(duì)列中刪除并返回
    QNode *FrontCell;
    DataType FrontElem;

    if (IsEmpty())
    {
        printf("Queue is empty!");
        return 0;
    }
    FrontCell = front;
    if (front == rear)
        //如果只有一個(gè)元素,表頭為空
        front = nullptr;
    else
        //如果超過一個(gè)元素,則指向上一個(gè)元素并釋放當(dāng)前元素空間
        front = front->Next;
    FrontElem = FrontCell->Data;
    free(FrontCell);
    return FrontElem;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚣旱,一起剝皮案震驚了整個(gè)濱河市碑幅,隨后出現(xiàn)的幾起案子戴陡,更是在濱河造成了極大的恐慌,老刑警劉巖沟涨,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恤批,死亡現(xiàn)場離奇詭異,居然都是意外死亡裹赴,警方通過查閱死者的電腦和手機(jī)喜庞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篮昧,“玉大人赋荆,你說我怎么就攤上這事笋妥“米颍” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵春宣,是天一觀的道長酵颁。 經(jīng)常有香客問我,道長月帝,這世上最難降的妖魔是什么躏惋? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮嚷辅,結(jié)果婚禮上簿姨,老公的妹妹穿的比我還像新娘。我一直安慰自己簸搞,他們只是感情好扁位,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趁俊,像睡著了一般域仇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寺擂,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天暇务,我揣著相機(jī)與錄音,去河邊找鬼怔软。 笑死垦细,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挡逼。 我是一名探鬼主播括改,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挚瘟!你這毒婦竟也來了叹谁?” 一聲冷哼從身側(cè)響起饲梭,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焰檩,沒想到半個(gè)月后憔涉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡析苫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年兜叨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衩侥。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡国旷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茫死,到底是詐尸還是另有隱情跪但,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布峦萎,位于F島的核電站屡久,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏爱榔。R本人自食惡果不足惜被环,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望详幽。 院中可真熱鬧筛欢,春花似錦、人聲如沸唇聘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雳灾。三九已至漠酿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谎亩,已是汗流浹背炒嘲。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匈庭,地道東北人夫凸。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像阱持,于是被迫代替她去往敵國和親夭拌。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355