這篇文章給大家分享的是有關(guān)在編程語(yǔ)言中怎樣定義隊(duì)列及其使用C++的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比桐鄉(xiāng)網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式桐鄉(xiāng)網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋桐鄉(xiāng)地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。
隊(duì)列在編程語(yǔ)言中是如何定義的呢?小編與大家分享自己的經(jīng)驗(yàn)。
隊(duì)列的定義
隊(duì)列是限制結(jié)點(diǎn)插入操作固定在一端進(jìn)行,而結(jié)點(diǎn)的刪除操作固定在另一端進(jìn)行的線性表.
隊(duì)列猶如一個(gè)兩端開口的管道.允許插入的一端稱為隊(duì)頭,允許刪除的一端稱為隊(duì)尾.隊(duì)頭和隊(duì)尾各用一個(gè)”指針”指示,稱為隊(duì)頭指針和隊(duì)尾指針.不含任何結(jié)點(diǎn)的隊(duì)列稱為”空隊(duì)列”.隊(duì)列的特點(diǎn)是結(jié)點(diǎn)在隊(duì)列中的排隊(duì)次序和出隊(duì)次序按進(jìn)隊(duì)時(shí)間先后確定,即先進(jìn)隊(duì)者先出隊(duì).因此,隊(duì)列又稱先進(jìn)先出表.簡(jiǎn)稱FIFO(first in first out)表.
步驟
隊(duì)列是用來(lái)存儲(chǔ)暫未處理但需要按一定順序處理的元素的一種數(shù)據(jù)結(jié)構(gòu)。
隊(duì)列是一種先進(jìn)先出(First In First Out,F(xiàn)IFO)的線性表,特點(diǎn)是先進(jìn)隊(duì)的元素先出隊(duì)。
隊(duì)列只允許在表的一端進(jìn)行插入,而在另一端刪除元素。
隊(duì)尾是隊(duì)列中允許插入的一端;隊(duì)首是隊(duì)列中允許刪除的一端。
一般用順序表q[m]存儲(chǔ)隊(duì)列中的元素,m是隊(duì)列能存儲(chǔ)元素的最大數(shù)量。
front隊(duì)首指針指向隊(duì)首元素存儲(chǔ)的位置;rear隊(duì)尾指針指向隊(duì)尾元素的下一個(gè)位置。
順序隊(duì)列及其操作
隊(duì)列的順序存儲(chǔ)結(jié)構(gòu)
順序存儲(chǔ)結(jié)構(gòu)存儲(chǔ)的隊(duì)列稱為順序隊(duì)列.和順序表一樣,用一個(gè)一維數(shù)組存.對(duì)頭在數(shù)組的低下標(biāo)端,隊(duì)尾設(shè)在高下表端.隊(duì)頭,隊(duì)尾指針值是數(shù)組元素的下標(biāo).對(duì)頭指針始終指向?qū)︻^結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)位置,初始值為0.隊(duì)尾指針是指向隊(duì)尾結(jié)點(diǎn)位置,初始值也為0.
隊(duì)列初始條件:隊(duì)頭指針=隊(duì)尾指針=0
隊(duì)列滿條件:隊(duì)尾指針=m(設(shè)隊(duì)列當(dāng)前容量為m)
隊(duì)列空條件:隊(duì)頭指針=隊(duì)尾指針
在QueueCs.c文件中定義了結(jié)構(gòu)
#define DT char #define M 100 typedef struct { DT data[M]; int front,rear; }SEQUEUE;
data[M]也為數(shù)組為隊(duì)列,front為隊(duì)頭指針,rear為隊(duì)尾指針.(注意:front和rear是整數(shù)類型,不是指針類型),當(dāng)front=rear=0時(shí),為初始隊(duì)列.因?yàn)镃語(yǔ)言中數(shù)組的第一個(gè)元素下標(biāo)為0,而不是1;所以這里約定數(shù)組元素data[0]閑置不用.
順序隊(duì)列上的操作
(1)創(chuàng)建隊(duì)列
初始化隊(duì)列,隊(duì)頭指針和隊(duì)尾指針=0.
在QueueControl.h寫出方法聲明
/* 創(chuàng)建隊(duì)列 */ SEQUEUE initQueue();
在QueueControl.c中實(shí)現(xiàn)此方法
#include "QueueControl.h" /* 創(chuàng)建隊(duì)列 */ SEQUEUE initQueue(){ SEQUEUE Q; //1.初始化隊(duì)列,隊(duì)頭指針=隊(duì)尾指針=0 Q.front=Q.rear=0; return Q; }
(2)插入
在QueueControl.h寫出方法聲明
/* 插入 */ SEQUEUE inQueue(SEQUEUE Q,DT x);
在QueueControl.c中實(shí)現(xiàn)此方法
#include "QueueControl.h" SEQUEUE inQueue(SEQUEUE Q,DT x){ //1.判斷隊(duì)列是上溢,就是隊(duì)尾指針是否等于最大申請(qǐng)的空間 if(Q.rear==M){ printf("Up Overflow\n"); }else{ //2.從隊(duì)尾插入結(jié)點(diǎn) Q.rear++; Q.data[Q.rear]=x; printf("in success\n"); } return Q; }
(3)刪除
在QueueControl.h寫出方法聲明
/* 刪除 */ SEQUEUE outQueue(SEQUEUE Q); /* 打印隊(duì)列元素 */ void printQueue(SEQUEUE Q);
在QueueControl.c中實(shí)現(xiàn)此方法
#include "QueueControl.h" SEQUEUE outQueue(SEQUEUE Q){ //1.首先判斷是否是空隊(duì)列 if(Q.front==Q.rear){ printf("queue is empty\n"); }else{ //2.刪除結(jié)點(diǎn)是從隊(duì)頭刪除 Q.front++; printf("out success\n"); } return Q; } /* 打印隊(duì)列元素 */ void printQueue(SEQUEUE Q){ //1.從隊(duì)頭開始打印數(shù)據(jù) SEQUEUE temp=Q; printf("queue={"); while (temp.front在main.c中的main方法(int main(int argc, const char * argv[]) {})調(diào)用此方法,并且進(jìn)行判斷
#include "QueueControl.h" int main(int argc, const char * argv[]) { //初始化順序隊(duì)列 SEQUEUE queue=initQueue(); printQueue(queue); //插入 queue=inQueue(queue, 'a'); queue=inQueue(queue, 'b'); queue=inQueue(queue, 'c'); queue=inQueue(queue, 'd'); printQueue(queue); //刪除 queue=outQueue(queue); printQueue(queue); return 0; }打印結(jié)果:
queue={}
in success
in success
in success
in success
queue={a,b,c,d}
out success
queue={b,c,d}
Program ended with exit code: 0從插入隊(duì)列和刪除隊(duì)列操作的打印結(jié)果來(lái)看,隊(duì)列的特點(diǎn)確實(shí)是:先進(jìn)先出.
循環(huán)隊(duì)列及其操作
循環(huán)隊(duì)列的存儲(chǔ)結(jié)構(gòu)
根據(jù)順序隊(duì)列的操作和敘述可以看出,隊(duì)尾指針=m表示隊(duì)滿,不能再插入結(jié)點(diǎn)了,當(dāng)隊(duì)頭指針等于隊(duì)尾指針表示對(duì)空.但是當(dāng)隊(duì)尾指針和隊(duì)尾指針都等于m的時(shí)候,那么此時(shí)表示對(duì)空,那么也不能插入了其他的結(jié)點(diǎn),但是此時(shí)0-m之間的結(jié)點(diǎn)已經(jīng)空閑,這樣許多空閑的結(jié)點(diǎn)不能被利用,浪費(fèi)存儲(chǔ)空間.
循環(huán)隊(duì)列是把順序隊(duì)列的頭尾相接形成一個(gè)圓環(huán).邏輯上吧1號(hào)結(jié)點(diǎn)作為m號(hào)結(jié)點(diǎn)的后繼結(jié)點(diǎn)處理.
循環(huán)隊(duì)列初始條件:隊(duì)頭指針=隊(duì)尾指針=0
循環(huán)隊(duì)列隊(duì)滿條件:MOD(隊(duì)尾指針+1,m)=隊(duì)頭指針
循環(huán)隊(duì)列空條件:隊(duì)頭指針=隊(duì)尾指針
隊(duì)頭指針推進(jìn)計(jì)算:隊(duì)頭指針=MOD(隊(duì)頭指針+1,m)
隊(duì)尾指針推進(jìn)計(jì)算:隊(duì)尾指針=MOD(隊(duì)尾指針+1,m)在QueueCycleCs.c文件中定義了結(jié)構(gòu)
#define CDT char #define CM 5 typedef struct { CDT data[CM]; int front,rear; }SECYCLEQUEUE;循環(huán)隊(duì)列上的操作
(1)創(chuàng)建循環(huán)隊(duì)列
初始化隊(duì)列,隊(duì)頭指針和隊(duì)尾指針=0.
在QueueCycyleControl.h寫出方法聲明
#include "QueueCycleCs.c" /* 創(chuàng)建循環(huán)隊(duì)列 */ SECYCLEQUEUE initCycleQueue();在QueueCycyleControl.c中實(shí)現(xiàn)此方法
#include "QueueCycleControl.h" /* 創(chuàng)建循環(huán)隊(duì)列 */ SECYCLEQUEUE initCycleQueue(){ SECYCLEQUEUE Q; //隊(duì)頭指針=隊(duì)尾指針=0; Q.front=Q.rear=0; return Q; }(2)插入
在QueueCycyleControl.h寫出方法聲明
#include "QueueCycleCs.c" /* 循環(huán)隊(duì)列插入 */ SECYCLEQUEUE inCycleQueue(SECYCLEQUEUE Q,char x);在QueueCycyleControl.c中實(shí)現(xiàn)此方法
#include "QueueCycleControl.h" SECYCLEQUEUE inCycleQueue(SECYCLEQUEUE Q,CDT x){ //1.判斷循環(huán)隊(duì)列是否已經(jīng)滿了,MOD(隊(duì)尾指針+1,m)=隊(duì)頭指針 if((Q.rear+1)%CM==Q.front){ printf("queue is full!\n"); }else{ //2.在隊(duì)尾插入,計(jì)算隊(duì)尾指針的 Q.rear=(Q.rear+1)%CM; //3.設(shè)置插入結(jié)點(diǎn)的值數(shù)值 Q.data[Q.rear]=x; printf("in Cycle queue Success!\n"); } return Q; }(3)刪除
在QueueCycyleControl.h寫出方法聲明
#include "QueueCycleCs.c" /* 循環(huán)隊(duì)列刪除 */ SECYCLEQUEUE outCycleQueue(SECYCLEQUEUE Q); /* 打印循環(huán)隊(duì)列 */ void printCycleQueue(SECYCLEQUEUE Q);在QueueCycyleControl.c中實(shí)現(xiàn)此方法
#include "QueueCycleControl.h" SECYCLEQUEUE outCycleQueue(SECYCLEQUEUE Q){ //1.判斷循環(huán)隊(duì)列是否是空 if(Q.front==Q.rear){ printf("Cycle queue is Empty!\n"); }else{ //2.刪除結(jié)點(diǎn)從隊(duì)頭刪除,計(jì)算隊(duì)頭指針:隊(duì)頭指針=MOD(隊(duì)頭指針+1,m) Q.front=(Q.front+1)%CM; printf("out cycle queue success!\n"); } return Q; } /* 打印循環(huán)隊(duì)列 */ void printCycleQueue(SECYCLEQUEUE Q){ //M=5; //1.從隊(duì)頭開始打印數(shù)據(jù) SECYCLEQUEUE temp=Q; printf("queue={"); //2.判斷的條件是,隊(duì)頭指針!=隊(duì)尾指針 while (temp.front!=temp.rear) { temp.front=(temp.front+1)%CM; if(temp.front==((Q.front+1)%CM)){ printf("%c",temp.data[temp.front]); }else{ printf(",%c",temp.data[temp.front]); } } printf("}\n"); }在main.c中的main方法(int main(int argc, const char * argv[]) {})調(diào)用此方法,并且進(jìn)行判斷
#include "QueueCycleControl.h" int main(int argc, const char * argv[]) { //創(chuàng)建循環(huán)隊(duì)列 SECYCLEQUEUE CQ=initCycleQueue(); //插入數(shù)據(jù)5個(gè)結(jié)點(diǎn),但是最大是5,一個(gè)空閑,最后一個(gè)添加不進(jìn)去, CQ=inCycleQueue(CQ, 'a'); CQ=inCycleQueue(CQ, 'b'); CQ=inCycleQueue(CQ, 'c'); CQ=inCycleQueue(CQ, 'd'); CQ=inCycleQueue(CQ, 'e'); printCycleQueue(CQ); //刪除節(jié)點(diǎn)-三個(gè)結(jié)點(diǎn) CQ=outCycleQueue(CQ); CQ=outCycleQueue(CQ); CQ=outCycleQueue(CQ); printCycleQueue(CQ); //插入-兩個(gè)結(jié)點(diǎn) CQ=inCycleQueue(CQ, 'e'); CQ=inCycleQueue(CQ, 'f'); printCycleQueue(CQ); //刪除節(jié)點(diǎn)--刪除四個(gè)結(jié)點(diǎn),現(xiàn)在此時(shí)是三個(gè)結(jié)點(diǎn),最后一個(gè)刪除不了 CQ=outCycleQueue(CQ); CQ=outCycleQueue(CQ); CQ=outCycleQueue(CQ); CQ=outCycleQueue(CQ); printCycleQueue(CQ); return 0; }打印結(jié)果:
in Cycle queue Success!
in Cycle queue Success!
in Cycle queue Success!
in Cycle queue Success!
queue is full!
queue={a,b,c,d}
out cycle queue success!
out cycle queue success!
out cycle queue success!
queue=squ6kqw
in Cycle queue Success!
in Cycle queue Success!
queue={d,e,f}
out cycle queue success!
out cycle queue success!
out cycle queue success!
Cycle queue is Empty!
queue={}
Program ended with exit code: 0鏈隊(duì)列及其操作
隊(duì)列的鏈存儲(chǔ)結(jié)構(gòu)
鏈存儲(chǔ)結(jié)構(gòu)存儲(chǔ)的隊(duì)列稱為鏈隊(duì)列.隊(duì)頭指針指向鏈隊(duì)列的頭結(jié)點(diǎn),頭結(jié)點(diǎn)的指針域若為空,則為空隊(duì)列;若不為空,則為指向隊(duì)首結(jié)點(diǎn)的指針.
鏈隊(duì)列設(shè)有一個(gè)隊(duì)頭指針,其值指向隊(duì)列的頭結(jié)點(diǎn).也是唯一地標(biāo)示一個(gè)鏈隊(duì).設(shè)置一個(gè)隊(duì)尾指針?lè)奖悴迦虢Y(jié)點(diǎn).隊(duì)頭指針和隊(duì)尾指針都是指針型變量.
鏈隊(duì)列沒(méi)有容量的限制,所以在可用的存儲(chǔ)空間范圍內(nèi),一般不會(huì)出現(xiàn)上溢問(wèn)題,也不存在如順序隊(duì)列的假溢出問(wèn)題.
在QueueLinkCs.c中定義了結(jié)構(gòu)
#define LDT char //結(jié)點(diǎn)類型 typedef struct llnode{ LDT data; struct llnode *next; }LINKNODE; //鏈隊(duì)列結(jié)構(gòu) typedef struct{ LINKNODE *front,*rear; }LINKQUEUE;鏈隊(duì)列上的操作
(1)創(chuàng)建鏈隊(duì)列
在QueueLinkControl.h寫出方法聲明
#include#include "QueueLinkCs.c" /* 創(chuàng)建鏈隊(duì) */ LINKQUEUE * initLinkQueue(LINKQUEUE *LQ); 在QueueLinkControl.c中實(shí)現(xiàn)此方法
#include "QueueLinkControl.h" #include/* 創(chuàng)建鏈隊(duì) */ LINKQUEUE *initLinkQueue(LINKQUEUE *LQ){ //設(shè)置隊(duì)頭指針 LQ->front=(LINKNODE *)malloc(sizeof(LINKNODE)); LQ->front->data='#';//設(shè)置隊(duì)頭指針,也是頭結(jié)點(diǎn)的指針域 LQ->front->next=NULL; //初始條件:隊(duì)頭指針和隊(duì)尾指針一致 LQ->rear=LQ->front; return LQ; } (2)插入
在QueueLinkControl.h寫出方法聲明
/* 鏈隊(duì)插入:隊(duì)尾 */ LINKQUEUE * inLinkQueue(LINKQUEUE *LQ,LDT x);在QueueLinkControl.c中實(shí)現(xiàn)此方法
(3)刪除
在QueueLinkControl.h寫出方法聲明
/* 鏈隊(duì)刪除:隊(duì)頭 */ LINKQUEUE *outLinkQueue(LINKQUEUE *LQ); /* 打印鏈表結(jié)點(diǎn) */ void printLinkQueue(LINKQUEUE *LQ);在QueueLinkControl.c中實(shí)現(xiàn)此方法
#include "QueueLinkControl.h" #includeLINKQUEUE *outLinkQueue(LINKQUEUE *LQ){ if(LQ==NULL || LQ->rear==LQ->front){ printf("LQ is empty!\n"); return LQ; } //1.獲取首結(jié)點(diǎn) LINKNODE *frontNextNode; frontNextNode=LQ->front->next; //2.將首節(jié)點(diǎn)的next指針域的值存儲(chǔ)頭結(jié)點(diǎn)的next域 LQ->front->next=frontNextNode->next; //3.如果隊(duì)尾結(jié)點(diǎn)等于首節(jié)點(diǎn)的next指針域的值,那么表示是空棧,根據(jù)空鏈隊(duì)列的結(jié)構(gòu),還需修改隊(duì)尾指針,使指向頭結(jié)點(diǎn). if(LQ->rear==frontNextNode){ LQ->rear=LQ->front; } //4.釋放刪除的結(jié)點(diǎn) free(frontNextNode); printf("out link queue success!\n"); return LQ; } /* 打印鏈表結(jié)點(diǎn) */ void printLinkQueue(LINKQUEUE *Q){ //實(shí)例化一個(gè)LQ,為了不改變?cè)瓉?lái)鏈隊(duì)Q LINKQUEUE *LQ; LQ=(LINKQUEUE *)malloc(sizeof(LINKQUEUE)); LQ->front=Q->front; LQ->rear=Q->rear; printf("queue={"); //1.判斷不是空鏈表 if(LQ!=NULL && LQ->rear!=LQ->front){ int flag=0; do{ //2.輸出數(shù)據(jù) if(flag==0){ printf("%c",LQ->front->data); flag=1; }else{ printf(",%c",LQ->front->data); } //3.鏈頭指針向后移動(dòng) LQ->front=LQ->front->next; }while (LQ->front!=LQ->rear) ; printf(",%c",LQ->front->data); } printf("}\n"); } 在main.c中的main方法(int main(int argc, const char * argv[]) {})調(diào)用此方法,并且進(jìn)行判斷
#include "QueueLinkControl.h" int main(int argc, const char * argv[]) { //創(chuàng)建鏈隊(duì)列 LINKQUEUE *LQ=(LINKQUEUE *)malloc(sizeof(LINKQUEUE)); LQ=initLinkQueue(LQ); //向鏈隊(duì)插入結(jié)點(diǎn) LQ=inLinkQueue(LQ,'a'); LQ=inLinkQueue(LQ,'b'); LQ=inLinkQueue(LQ,'c'); LQ=inLinkQueue(LQ,'d'); printLinkQueue(LQ); //刪除結(jié)點(diǎn)--從隊(duì)頭 LQ=outLinkQueue(LQ); LQ=outLinkQueue(LQ); printLinkQueue(LQ); return 0; }打印結(jié)果:
in link queue success!
in link queue success!
in link queue success!
in link queue success!
queue={#,a,b,c,d}
out link queue success!
out link queue success!
queue={#,c,d}
Program ended with exit code: 0感謝各位的閱讀!關(guān)于“在編程語(yǔ)言中怎樣定義隊(duì)列及其使用C++”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
本文標(biāo)題:在編程語(yǔ)言中怎樣定義隊(duì)列及其使用C++
分享地址:http://weahome.cn/article/pigjjp.html