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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

隊列-隊列的順序表示和實現

和順序棧相類似,在利用順序分配存儲結構實現隊列時,除了用一維數組描述隊列中數據元素的存儲區域之外,尚需設立兩個指針front和rear分別指示“隊頭”和“隊尾”的位置。

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

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

因為是頭尾相接的循環結構,

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

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

設MAXSIZE=10,下圖是循環隊列操作示意圖。

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

方法之一是附設一個存儲隊中元素個數的變量如num,當num==0時隊空,當num==MAXSIZE時為隊滿。

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

隊列的順序存儲結構

typedef?struct?{

QElemtype?*base;//初始化的動態分配存儲空間

int?front;//隊頭指針

int?rear;//隊尾指針

}SqQueue;

循環隊列的實現

下面的循環隊列及操作按第二種方法實現。

#include?

#include?

#define?MAXSIZE?10

#define?OK?1

#define?ERROR?0

#define?OVERFLOW?-2

typedef?int?Status;

typedef?int?QElemtype;

typedef?struct?{

QElemtype?*base;//初始化的動態分配存儲空間

int?front;//隊頭指針

int?rear;//隊尾指針

}SqQueue;//循環隊列

//--------------------循環隊列的基本操作的算法描述------------------

Status?InitQueue(SqQueue?*q)

{//構造一個空隊列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的元素個數,即隊列的長度

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

}

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

{//插入元素e為Q的新的隊尾元素

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

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

//入隊的操作

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

return?OK;

}

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

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

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

*e=q->base[q->front];?//指針的下標運算

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

return?OK;

}

void?display_queue(SqQueue?*q){

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

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

}else?{

//遍歷該循環隊列

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("循環隊列已滿,該隊列長度為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("循環隊列的遍歷\n");

display_queue(&q);

int?e6;

DeQueue(&q,&e6);

printf("循環隊列的遍歷\n");

display_queue(&q);

system("pause");

return?0;

}

運行結果:

循環隊列已滿,該隊列長度為9

循環隊列已滿,該隊列長度為9

the?length?of?queue?is?9

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

the?length?of?queue?is?4

循環隊列的遍歷

5

6

7

8

循環隊列的遍歷

6

7

8

請按任意鍵繼續.?.?.

注:數學中的余數其實就是取模運算

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

x mod y = x % y

數學中的余數概念和我們的計算機中的余數概念一致,但實現卻不一致。

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。