日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

队列的顺序数组c语言代码,队列-队列的顺序表示和实现

發(fā)布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 队列的顺序数组c语言代码,队列-队列的顺序表示和实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

隊(duì)列-隊(duì)列的順序表示和實(shí)現(xiàn)

和順序棧相類似,在利用順序分配存儲結(jié)構(gòu)實(shí)現(xiàn)隊(duì)列時,除了用一維數(shù)組描述隊(duì)列中數(shù)據(jù)元素的存儲區(qū)域之外,尚需設(shè)立兩個指針front和rear分別指示“隊(duì)頭”和“隊(duì)尾”的位置。

為了在C語言中描述方便,在此我們約定:初始化建空隊(duì)列時,令front=rear=0。每當(dāng)插入新的隊(duì)列尾元素時,“尾指針增1”;每當(dāng)刪除隊(duì)列頭元素時,“頭指針增1”。因此,在非空隊(duì)列中,頭指針始終指向隊(duì)列頭元素位置,隊(duì)尾指針始終指向隊(duì)列尾元素的下一個位置。如圖所示:

從圖中可以看到,隨著入隊(duì)出隊(duì)的進(jìn)行,會使整個隊(duì)列整體向后移動,這樣就出現(xiàn)了循環(huán)隊(duì)列操作示意圖(d)中的現(xiàn)象(假溢出現(xiàn)象):隊(duì)尾指針已經(jīng)移到了最后,再有元素入隊(duì)就會出現(xiàn)溢出,而事實(shí)上此時隊(duì)中并未真的“滿員”,這種現(xiàn)象為“假溢出”,這是由于“隊(duì)尾入隊(duì)頭出”這種受限制的操作所造成。解決假溢出的方法之一是將隊(duì)列看成頭尾相接的循環(huán)結(jié)構(gòu),頭尾指針的關(guān)系不變,將其稱為“循環(huán)隊(duì)列”,“循環(huán)隊(duì)列”的示意圖如下圖所示:

因?yàn)槭穷^尾相接的循環(huán)結(jié)構(gòu),

入隊(duì)時的隊(duì)尾指針加1操作修改為:q.rear=(q.rear+1) % MAXSIZE;

出隊(duì)時的隊(duì)頭指針加1操作修改為:q.front=(q.front+1) % MAXSIZE;

設(shè)MAXSIZE=10,下圖是循環(huán)隊(duì)列操作示意圖。

如上圖所示的循環(huán)隊(duì)可以看出,(a)中具有a5、a6、a7、a8四個元素,此時front=5,rear=9;隨著a9~a14相繼入隊(duì),隊(duì)中具有了10個元素--隊(duì)滿,此時front=5,rear=5,如(b)所示,可見在隊(duì)滿情況下有:front==rear。若在(a)情況下,a5~a8相繼出隊(duì),此時隊(duì)空,front=9,rear=9,如(c)所示,即在隊(duì)空情況下也有:front==rear。就是說“隊(duì)滿”和“隊(duì)空”的條件是相同的了。這顯然是必須要解決的一個問題。

方法之一是附設(shè)一個存儲隊(duì)中元素個數(shù)的變量如num,當(dāng)num==0時隊(duì)空,當(dāng)num==MAXSIZE時為隊(duì)滿。

另一種方法是少用一個元素空間,把圖(d)所示的情況就視為隊(duì)滿,此時的狀態(tài)是隊(duì)尾指針加1就會從后面趕上隊(duì)頭指針,這種情況下隊(duì)滿的條件是:(q->rear+1) % MAXSIZE == q->front,也能和空隊(duì)區(qū)別開。

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

typedef?struct?{

QElemtype?*base;//初始化的動態(tài)分配存儲空間

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

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

}SqQueue;

循環(huán)隊(duì)列的實(shí)現(xiàn)

下面的循環(huán)隊(duì)列及操作按第二種方法實(shí)現(xiàn)。

#include?

#include?

#define?MAXSIZE?10

#define?OK?1

#define?ERROR?0

#define?OVERFLOW?-2

typedef?int?Status;

typedef?int?QElemtype;

typedef?struct?{

QElemtype?*base;//初始化的動態(tài)分配存儲空間

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

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

}SqQueue;//循環(huán)隊(duì)列

//--------------------循環(huán)隊(duì)列的基本操作的算法描述------------------

Status?InitQueue(SqQueue?*q)

{//構(gòu)造一個空隊(duì)列Q

q->base=(QElemtype*)malloc(MAXSIZE*sizeof(QElemtype));

if(!q->base)exit(OVERFLOW);//存儲分配失敗

q->front=?q->rear?=0;

return?OK;

}

int?queuelength(SqQueue?q)

{//返回Q的元素個數(shù),即隊(duì)列的長度

return?(q.rear?-?q.front?+?MAXSIZE)?%?MAXSIZE;

}

Status?EnQueue?(SqQueue?*q,QElemtype?e)

{//插入元素e為Q的新的隊(duì)尾元素

if?((q->rear+1)?%?MAXSIZE?==?q->front)?return?ERROR;//隊(duì)列滿,不進(jìn)行任何操作,不能再入隊(duì)

q->base[q->rear]=e;

//入隊(duì)的操作

q->rear=(q->rear+1)?%?MAXSIZE;

return?OK;

}

Status?DeQueue?(SqQueue?*q,QElemtype?*e)

{//若隊(duì)列不空,則刪除Q的對頭元素,用e返回其值,并返回OK;否則返回ERROR

if?(q->front==q->rear)?return?ERROR;//隊(duì)列滿

*e=q->base[q->front];?//指針的下標(biāo)運(yùn)算

q->front=(q->front+1)?%?MAXSIZE;

return?OK;

}

void?display_queue(SqQueue?*q){

if(q->front==q->rear){

printf("queue?is?empty!!\n");

}else?{

//遍歷該循環(huán)隊(duì)列

int?front?=?q->front;

int?rear?=?q->rear;

while(front!=rear){

printf("%d\n",q->base[front]);

++front;

}

}

}

int?main(){

SqQueue?q;

InitQueue(&q);

int?i;

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

if(EnQueue(&q,i)==ERROR){

printf("循環(huán)隊(duì)列已滿,該隊(duì)列長度為9?\n");

}

}

printf("the?length?of?queue?is?%d?\n",queuelength(q));?//the?length?of?queue?is?9

int?e1,e2,e3,e4,e5;

DeQueue(&q,&e1);

DeQueue(&q,&e2);

DeQueue(&q,&e3);

DeQueue(&q,&e4);

DeQueue(&q,&e5);

printf("%d--%d--%d--%d--%d?\n",e1,e2,e3,e4,e5);

printf("the?length?of?queue?is?%d?\n",queuelength(q));

printf("循環(huán)隊(duì)列的遍歷\n");

display_queue(&q);

int?e6;

DeQueue(&q,&e6);

printf("循環(huán)隊(duì)列的遍歷\n");

display_queue(&q);

system("pause");

return?0;

}

運(yùn)行結(jié)果:

循環(huán)隊(duì)列已滿,該隊(duì)列長度為9

循環(huán)隊(duì)列已滿,該隊(duì)列長度為9

the?length?of?queue?is?9

0--1--2--3--4

the?length?of?queue?is?4

循環(huán)隊(duì)列的遍歷

5

6

7

8

循環(huán)隊(duì)列的遍歷

6

7

8

請按任意鍵繼續(xù).?.?.

注:數(shù)學(xué)中的余數(shù)其實(shí)就是取模運(yùn)算

如,m模n (c語言表示 m%n )

x mod y = x % y

數(shù)學(xué)中的余數(shù)概念和我們的計算機(jī)中的余數(shù)概念一致,但實(shí)現(xiàn)卻不一致。

========END========

總結(jié)

以上是生活随笔為你收集整理的队列的顺序数组c语言代码,队列-队列的顺序表示和实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。