隊(duì)列

注:不足及錯(cuò)誤請(qǐng)指正


+qq1366963396討論

隊(duì)列(queue)是只允許在一端進(jìn)行插入操作合瓢,而在另一端進(jìn)行刪除操作的線(xiàn)性表埋凯。

是一種先進(jìn)先出的線(xiàn)性表点楼。

一.循環(huán)隊(duì)列

struct Queue

{

????int data[MAXSIZE];

????int front;//頭指針

????int rear;//尾指針

};


循環(huán)隊(duì)列

如果不是循環(huán)隊(duì)列,出列是在隊(duì)頭白对,那么后面所有元素都必須向前移動(dòng)掠廓,可是為什么又要全部移動(dòng)呢,隊(duì)頭可以不在下標(biāo)為0的位置呀甩恼,但是如果一直再往隊(duì)尾插入蟀瞧,會(huì)導(dǎo)致隊(duì)列假溢出沉颂,也就是數(shù)組越界,而前面還有空閑的地方悦污。所以铸屉,我們想到用循環(huán)隊(duì)列,即隊(duì)列的頭尾相接的順序存儲(chǔ)結(jié)構(gòu)塞关。

但是又有問(wèn)題了抬探,什么時(shí)候表示為隊(duì)滿(mǎn)呢,rear==front?可是隊(duì)空的時(shí)候也是rear==front呀帆赢。所以有以下兩種辦法:

*****設(shè)置標(biāo)志量flag,當(dāng)front==rear&&flag=0時(shí)隊(duì)列為空线梗,front==reat&&flag=1時(shí)隊(duì)列為滿(mǎn)椰于。

*****還有就是可以保留一個(gè)元素空間,也就是說(shuō)仪搔,當(dāng)隊(duì)列滿(mǎn)時(shí)數(shù)組中還有一個(gè)空閑單元瘾婿,例如上圖所示就認(rèn)為隊(duì)列已滿(mǎn),重點(diǎn)討論第二種辦法烤咧。

//初始化空隊(duì)列

void InitQueue(Queue* Q)

{

????Q->front = 0;

????Q->rear = 0;

}

//判隊(duì)空

bool IsEmpty(Queue* Q)

{

????if (Q->front ==Q->rear)

????????return true;

????return false;

}

//判隊(duì)滿(mǎn)

bool IsFull(Queue* Q)

{

????if ((Q->rear + 1) % MAXSIZE == Q->front)

????????return true;

????return false;

}

//求隊(duì)列長(zhǎng)度

int QueueLength(Queue* Q)

{

????return????(Q->rear - Q->front + MAXSIZE)%MAXSIZE;

}

//入隊(duì)

bool EnQueue(Queue* Q, int data)

{

????if (IsFull(Q))//判隊(duì)滿(mǎn)

????????return false;

????Q->data[Q->rear] = data;

????Q->rear = (Q->rear + 1) % MAXSIZE;//front后移

????return true;

}

//出隊(duì)

int DeQueue(Queue* Q, int data)

{

????if (IsEmpty(Q))//判隊(duì)空

????????return NULL;

????data = Q->data[Q->front];

????Q->front = (Q->front++) % MAXSIZE;//front后移

????return data;

}

//建隊(duì)

void CreatQueue(Queue* Q)

{

????InitQueue(Q);

????int data = 0;

????int i = 1; //計(jì)數(shù)

????while (1)

????{

????????printf("請(qǐng)輸入隊(duì)列第%d個(gè)元素:", i);

????????scanf("%d", &data);

????????if (data==-1||IsFull(Q))//隊(duì)滿(mǎn)-1表示結(jié)束

????????????break;

????????EnQueue(Q, data);//入隊(duì)

????????i++;

????}

}

二.鏈?zhǔn)酱鎯?chǔ)隊(duì)列

struct QueueNode//節(jié)點(diǎn)結(jié)構(gòu)

{

????int data;

????QueueNode* next;

};

struct LinkQueue//隊(duì)列的鏈表結(jié)構(gòu)

{

????QueueNode* front;//隊(duì)頭指針

????QueueNode* rear;//隊(duì)尾指針

};

//初始化空隊(duì)

void InitQueue(LinkQueue* Q)

{

????Q->front =Q->rear =(QueueNode*)malloc(sizeof(QueueNode));//生成頭結(jié)點(diǎn)

????Q->front->next= NULL;//置空隊(duì)

????Q->rear->next = NULL;

}

//置空隊(duì)

void SetEmptyQueue(LinkQueue* Q)

{

????Q->front->next = NULL;

????Q->front = Q->rear;

}

//判隊(duì)空

bool IsEmpty(LinkQueue* Q)

{

????if (Q->front == Q->rear)

????????return true;

????return false;

}

//求隊(duì)列長(zhǎng)度

int LengthQueuue(LinkQueue* Q,int length)

{

????QueueNode* p = Q->front->next;

????while (p)

????{

????????length++;

????????p = p->next;

????}

????return length;

}

//入隊(duì)

void EnQueue(LinkQueue* Q, int data)

{

????QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));//申請(qǐng)新節(jié)點(diǎn)

????newNode->data = data;

????newNode->next = NULL;

????Q->rear->next = newNode;//尾節(jié)點(diǎn)指向新節(jié)點(diǎn)

????Q->rear = newNode;//新節(jié)點(diǎn)成為尾節(jié)點(diǎn)

}

//出隊(duì)

int DeQueue(LinkQueue* Q, int data)

{

????if (IsEmpty(Q))//判隊(duì)空

????????return NULL;

????QueueNode* p = (QueueNode*)malloc(sizeof(QueueNode));//申請(qǐng)p存放隊(duì)頭節(jié)點(diǎn)

????p = Q->front->next;

????data = p->data;//取得刪除的隊(duì)頭節(jié)點(diǎn)值

????Q->front->next = p->next;//頭結(jié)點(diǎn)指向刪除節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)

????if (Q->rear == p)//若隊(duì)頭是隊(duì)尾偏陪,刪除后將rear指向頭結(jié)點(diǎn)

????????Q->rear = Q->front;

????free(p);

????return data;

}

//建隊(duì)

void CreatQueue(LinkQueue* Q)

{

????int data = 0;

????int i = 0;

????while (1)

????{

????????printf("請(qǐng)輸入第%d個(gè)元素:", ++i);

????????scanf("%d", &data);

????????if (data==-1)//-1表示結(jié)束

????????????break;

????????EnQueue(Q, data);//入隊(duì)

????}

}

應(yīng)用:球鐘問(wèn)題(棧和隊(duì)列)

基本程序與上文一致

球鐘問(wèn)題描述:球鐘是一個(gè)利用球的移動(dòng)來(lái)記錄時(shí)間的簡(jiǎn)單裝置。他有三個(gè)可以容納若干球的指示器:分鐘指示器煮嫌,五分鐘指示器笛谦,小時(shí)指示器。若分鐘指示器中有兩個(gè)球昌阿,5分鐘指示器中有6個(gè)球饥脑,小時(shí)指示器中有5個(gè)球,則時(shí)間為5:32.

工作原理:每過(guò)一分鐘懦冰,球鐘就會(huì)從球隊(duì)列的隊(duì)首取出一個(gè)球放入分鐘指示器灶轰,分鐘指示器可最多容納四個(gè)球。當(dāng)放入第五個(gè)球時(shí)刷钢,在分鐘指示器的4個(gè)球就會(huì)按照他們被放入時(shí)的相反順序加入球隊(duì)列的隊(duì)尾笋颤。而第五個(gè)球就會(huì)進(jìn)入分鐘指示器。依此類(lèi)推内地,五分鐘指示器最多可放11個(gè)球伴澄,小時(shí)指示器最多可放11個(gè)球。當(dāng)小時(shí)指示器放入第12個(gè)球時(shí)瓤鼻,原來(lái)的11個(gè)球按照他們被放入時(shí)的相反順序加入球隊(duì)列的隊(duì)尾秉版,然后第12個(gè)球也回到隊(duì)尾。這時(shí)三個(gè)指示器均為空茬祷,回到初始狀態(tài)清焕,從而形成一個(gè)循環(huán)。因此,該球鐘表示的時(shí)間范圍時(shí)從00:00到11:59秸妥;

bool TrueBallQueue(LinkQueue* Q)//是否與原來(lái)狀態(tài)相同

{

????QueueNode* p = Q->front->next;

????for (int i = 1; i <= 27; i++)

????{

????????if (p->data != i)

????????????return false;

????????p = p->next;

????}

????return true;

}

//主程序

int main()

{

????Stack* mStack = (Stack*)malloc(sizeof(Stack));//分鐘棧

????Stack* fmStack = (Stack*)malloc(sizeof(Stack)); //五分鐘棧

????Stack*hStack = (Stack*)malloc(sizeof(Stack));//小時(shí)棧

????LinkQueue* ballQueue = (LinkQueue*)malloc(sizeof(LinkQueue));球隊(duì)列

????int data=0;

????int time = 0;//記錄計(jì)滿(mǎn)次數(shù)

????//隊(duì)列滚停,棧初始化

????InitStack(mStack);//分鐘棧

????InitStack(fmStack);//五分鐘棧

????InitStack(hStack);//小時(shí)棧

????InitQueue(ballQueue);//球隊(duì)列

????//給隊(duì)列裝球

????int i = 0;

????for (i = 1; i <= 27; i++)

????{

????????EnQueue(ballQueue,i);

????}

????while (1)//從球隊(duì)列出球進(jìn)入分鐘指示器

????{

????????data = DeQueue(ballQueue,data);//球出隊(duì)

????????if (mStack->top == 3)//分鐘是否計(jì)滿(mǎn)

????????{

????????????int i = 0;

????????????int temp;

????????????//分鐘指示器的球進(jìn)入球隊(duì)列

????????????for (i = 0; i < 4; i++)

????????????{

????????????????temp = PopStack(mStack);

????????????????EnQueue(ballQueue, temp);

????????????}

????????????if (fmStack->top == 10)//5分鐘指示器是否計(jì)滿(mǎn)

? ? ? ? ? ? {

????????????//計(jì)滿(mǎn)退棧

????????????????for (i = 0; i < 11; i++)

????????????????{

????????????????????temp = PopStack(fmStack);

????????????????????EnQueue(ballQueue, temp);

????????????????}

????????????????if (hStack->top == 10)//小時(shí)指示器是否計(jì)滿(mǎn)

????????????????{

????????????????//計(jì)滿(mǎn)退棧

????????????????????for (i = 0; i < 11; i++)

????????????????????{

????????????????????????temp = PopStack(hStack);

????????????????????????EnQueue(ballQueue, temp);

????????????????????}

????????????????????EnQueue(ballQueue, data);

????????????????????time++;//計(jì)滿(mǎn)一次,即12小時(shí)

????????????????????if (TrueBallQueue(ballQueue))//回到初始狀態(tài)

????????????????????{

????????????????????????break;

????????????????????}

????????????????}

????????????????else

????????????????{

????????????????????PushStack(hStack, data);

????????????????}

????????????}

????????????else

????????????{

????????????????PushStack(fmStack, data);

????????????}

????????}

????????else

????????{

????????????PushStack(mStack, data);

????????}

????}

????time = (time * 12) / 24;

????printf("需要經(jīng)過(guò)%d天球隊(duì)列恢復(fù)初始狀態(tài)粥惧!\n", time);

????return 0;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末键畴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子突雪,更是在濱河造成了極大的恐慌起惕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咏删,死亡現(xiàn)場(chǎng)離奇詭異惹想,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)督函,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)嘀粱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人辰狡,你說(shuō)我怎么就攤上這事锋叨。” “怎么了宛篇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵娃磺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我些己,道長(zhǎng)豌鸡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任段标,我火速辦了婚禮涯冠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逼庞。我一直安慰自己蛇更,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布赛糟。 她就那樣靜靜地躺著派任,像睡著了一般。 火紅的嫁衣襯著肌膚如雪璧南。 梳的紋絲不亂的頭發(fā)上掌逛,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音司倚,去河邊找鬼豆混。 笑死篓像,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的皿伺。 我是一名探鬼主播员辩,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鸵鸥!你這毒婦竟也來(lái)了奠滑?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤妒穴,失蹤者是張志新(化名)和其女友劉穎宋税,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體讼油,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弃甥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了汁讼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阔墩,死狀恐怖嘿架,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啸箫,我是刑警寧澤耸彪,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站忘苛,受9級(jí)特大地震影響蝉娜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扎唾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一召川、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胸遇,春花似錦荧呐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至逗威,卻和暖如春峰搪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凯旭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工概耻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留使套,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓咐蚯,卻偏偏與公主長(zhǎng)得像童漩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子春锋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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