真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

循環(huán)隊(duì)列的實(shí)現(xiàn)-創(chuàng)新互聯(lián)

隊(duì)列的一個(gè)非常重要的特點(diǎn)就是:只允許在隊(duì)列的頭部進(jìn)行刪除操作,只允許在隊(duì)列的尾部進(jìn)行插入操作。

成都創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)永新,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108

  所以,很明顯,隊(duì)列這種結(jié)構(gòu)需要兩個(gè)指針,一個(gè)指針指向隊(duì)列的頭部,一個(gè)指針指向隊(duì)列的尾部。既然隊(duì)列這種結(jié)構(gòu)也是用來(lái)存放數(shù)據(jù)的,當(dāng)有一個(gè)數(shù)據(jù)存入隊(duì)列中時(shí),指向尾部的指針就向后加1,當(dāng)刪除一個(gè)元素時(shí),頭指針就向后加1,由于我們定義當(dāng)隊(duì)列為空時(shí),指向頭部的指針和指向尾部的指針重合,所以,當(dāng)刪除到剩余最后一個(gè)元素時(shí),頭指針front和尾指針rear就重合了,這樣會(huì)和我們定義的隊(duì)列為空兩指針重合相矛盾。所以,我們要做的就是,將尾指針rear指向隊(duì)列尾部的下一個(gè)位置。這樣,問題就解決了。

  如果有數(shù)據(jù)插入,我們可以將rear+1,當(dāng)數(shù)據(jù)不需要而要將其刪除時(shí),我們將front+1,直到rear指向隊(duì)列尾部的下一個(gè)位置,已經(jīng)沒有位置可以放新的元素了,那么此時(shí)隊(duì)列真的已經(jīng)滿了嗎?當(dāng)然沒有,因?yàn)閯h除一個(gè)元素時(shí),front++,所以,在front前面還有位置可以放元素,所以此時(shí),這種虛假的隊(duì)列滿的情況,稱之為“假溢出”。

  那么如何解決這個(gè)假溢出的現(xiàn)象呢?當(dāng)然有辦法,就是通過(guò)循環(huán)隊(duì)列,當(dāng)rear指針指向最后一個(gè)位置時(shí),就將它置為0,指向隊(duì)列頭部。那假設(shè)我們有了一個(gè)循環(huán)隊(duì)列,當(dāng)rear向后自增,又從0開始接著向后自增,直到和front重合時(shí),隊(duì)列滿。這樣一來(lái),我們又帶來(lái)一個(gè)問題,我們?cè)趺磁袛鄏ear==front到底是隊(duì)列為空還是隊(duì)列是滿的呢?解決的辦法就是空出一個(gè)單元,不存放任何數(shù)據(jù),也就是當(dāng)rear+1 == front時(shí),就意味著滿隊(duì)列了。所以,判斷滿隊(duì)列的條件就是:

( reat + 1 ) % QueueSize == front;

此時(shí),就認(rèn)為是滿隊(duì)列狀態(tài)。

  那么我該如何計(jì)算隊(duì)列的長(zhǎng)度呢?因?yàn)閞ear有可能比f(wàn)ront大也有可能比f(wàn)ront小,我該如何確定隊(duì)列的元素個(gè)數(shù)呢?第一種情況,rear > front。此時(shí),只要將rear - front就可以計(jì)算出隊(duì)列的長(zhǎng)度了。

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

由圖所示,圖中有2個(gè)元素,a3和a4。所以,我們要計(jì)算隊(duì)列長(zhǎng)度,只需將rear-front,就可以得出結(jié)果了。第二種情況,rear < front。如圖所示:

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

當(dāng)碰到這種出現(xiàn)假溢出形式的時(shí)候,我們?cè)撊绾斡?jì)算隊(duì)列的長(zhǎng)度呢?很明顯,此時(shí),隊(duì)列長(zhǎng)度的計(jì)算分為兩段,一段是front之后的元素,一段是rear之前的元素,計(jì)算A3和A4這兩個(gè)元素,我們只需(QueueSize - front)這樣以來(lái),就算出來(lái)了,此時(shí)QueueSize的值為5,那么(5 - 3 )的值為2,所以,第一段元素的長(zhǎng)度為2,第二段元素長(zhǎng)度,只需要(0 + rear ) 就可以了,也就是(0 + 2 ),此時(shí)值為2,所以,隊(duì)列真正的長(zhǎng)度就為(2 + 2 = 4 ), 那么隊(duì)列的長(zhǎng)度就計(jì)算出來(lái)了。

因?yàn)橛袃煞N情況,所以,為了實(shí)現(xiàn)通用,就有一個(gè)標(biāo)準(zhǔn)的計(jì)算隊(duì)列長(zhǎng)度的公式:

( rear - front + QueueSize ) % QueueSize

  接下來(lái),就來(lái)定義一個(gè)循環(huán)隊(duì)列的結(jié)構(gòu):

typedef int QElemType;

typedef struct{

    QElemType data[MAXSIZE];
    int front;
    int  rear;
}SqQueue;

如果要初始化一個(gè)隊(duì)列,我們?cè)撊绾巫瞿兀?/p>

Status InitQueue ( SqQueue *Q ){

    Q->front = 0;
    Q->rear = 0;
    
    return OK;
}

求循環(huán)隊(duì)列的長(zhǎng)度

int QueueLength ( SqQueue Q ){

    return ( Q.rear - Q.front + MAXSIZE ) % MAXSIZE;

}

循環(huán)隊(duì)列元素的插入

Status EnQueue ( SqQueue *Q, QElemType e ){

    if ( ( Q->rear + 1 ) % MAXSIZE == front )
        return ERROR;
    
    Q->data[Q->rear] = e;
    Q->rear = ( Q->rear + 1 ) % MAXSIZE;
    
    return OK; 

}

循環(huán)隊(duì)列元素的刪除

Status DeQueue ( SqQueue *Q, QElemType *e ){

    if ( Q->rear == Q->front )
        return ERROR;
        
    *e = Q->data[Q->front];
    Q->front = ( Q->front + 1 ) % MAXSIZE;
    
    return OK;

}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


本文名稱:循環(huán)隊(duì)列的實(shí)現(xiàn)-創(chuàng)新互聯(lián)
標(biāo)題URL:http://weahome.cn/article/coogee.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部