最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C利用語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)之隊(duì)列

 更新時間:2021年10月08日 09:04:10   作者:柳兮  
隊(duì)列 (Queue):簡稱隊(duì),是另一種限定性的線性表,它只允許在表的一端插入元素,而在另一端刪除元素。q=(a1, a2, a3, … an),其中a1為隊(duì)頭,an為隊(duì)尾,下面文章小編將為大家詳細(xì)介紹,需要的下伙伴可以參考一下

前言:

隊(duì)列在生活中也比較常見,例如購物排隊(duì)——新來的成員總是加入隊(duì)尾,每次離開的成員總是隊(duì)列頭上的。

隊(duì)列按存儲方式可以分為兩種:順序隊(duì)列和鏈隊(duì)列。

一、鏈隊(duì)列

鏈?zhǔn)疥?duì)列中每個元素定義成一個結(jié)點(diǎn),含數(shù)據(jù)域與指針域(指向下一結(jié)點(diǎn)),并設(shè)頭尾指針。用圖表示就是。

二、鏈隊(duì)的表示

前面的鏈?zhǔn)浇Y(jié)構(gòu),總是使用一個結(jié)點(diǎn)的結(jié)構(gòu)來表示鏈表,但是在這里使用新的存儲結(jié)構(gòu)。定義一個結(jié)點(diǎn)結(jié)構(gòu),和一個隊(duì)列結(jié)構(gòu)。兩個結(jié)構(gòu)嵌套。

//定義節(jié)點(diǎn)結(jié)構(gòu)
typedef struct QNode
{
    QElemType   data;   /*數(shù)據(jù)域*/
    struct QNode   * next;   /*指針域*/
 }QNode, *QueuePtr;
//定義隊(duì)列結(jié)構(gòu)
 typedef struct
 {
    QueuePtr front;
    QueuePtr rear;
 }LinkQueue;

三、鏈隊(duì)的基本操作

1. 鏈隊(duì)的初始化

Status initQueue(LinkQueue *Q)
{ 
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    if(!Q.front) exit(OVERFLOW);
    Q.front->next = NULL;
    return OK;
}

2. 鏈隊(duì)的銷毀

Status destroyQueue(LinkQueue *Q)
{
    while (Q.front)
    {
        Q.rear = Q.front->next;
        free(Q.front);
        Q.front = Q.rear;
    }
   return OK;
}

3. 入隊(duì)

Status enQueue(LinkQueue *Q, QElemType e)
{
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if(!p) exit(OVERFLOW);
    //插入數(shù)據(jù)
    p->data = e;
    p->next = NULL;
    //Q.rear一直指向隊(duì)尾
    Q.rear->next = p;
    Q.rear = p;
    return OK;
 }

4. 出隊(duì)

Status deQueue(LinkQueue *Q, QElemType e)
{
    if(Q.front == Q.rear) return ERROR;
    QueuePtr p = Q.front->next;
    e = p->data;
    Q.front->next = p->next;   //隊(duì)頭元素p出隊(duì)
    if(Q.rear == p)   //如果隊(duì)中只有一個元素p, 則p出隊(duì)后成為空隊(duì)
    Q.rear = Q.front;     //給隊(duì)尾指針賦值
    free(p);   //釋放存儲空間
    return OK;
}

四、順序隊(duì)列

用一組連續(xù)的存儲單元依次存放隊(duì)列的元素,并設(shè)兩個指針front、rear分別指示隊(duì)頭和隊(duì)尾元素的位置。
front:指向?qū)嶋H的隊(duì)頭;rear:指向?qū)嶋H隊(duì)尾的下一位置。
初態(tài)front=rear=0;隊(duì)空:front=rear;隊(duì)滿:rear=M;
入隊(duì)q[rear]=x; rear= rear+1; 出隊(duì):x=q[front];front=front+1;

順序隊(duì)列的表示:

#define MAXQSIZE  100
typedef struct
{
    QElemType *base;
    int  front;   //頭指針指示器 
    int  rear;  //尾指針指示器
} SqQueue;

存在的問題:

隨著入隊(duì)、出隊(duì)操作的進(jìn)行,整個隊(duì)列會整體向后移動,這樣就出現(xiàn)了下圖的現(xiàn)象:隊(duì)尾指針雖然已經(jīng)移到了最后,而隊(duì)列卻未真滿的“假溢出”現(xiàn)象,使得隊(duì)列的空間沒有得到有效的利用

那我們該如何解決假溢出的問題呢?

有以下兩種方法:

  • 將隊(duì)中元素向隊(duì)頭移動:當(dāng)移動數(shù)據(jù)較多時將會影響隊(duì)列的操作速度。
  • 采用循環(huán)隊(duì)列:Q[0]接在Q[MAXQSIZE-1]之后,一個更有效的方法是將隊(duì)列的數(shù)據(jù)區(qū)Q[0 .. MAXQSIZE-1]看成是首尾相連的環(huán),即將表示隊(duì)首的元素Q[0]與表示隊(duì)尾的元素Q[MAXQSIZE–1]連接起來,形成一個環(huán)形表,這就成了循環(huán)隊(duì)列。當(dāng)Q.rear=MAXQSIZE-1時再入隊(duì),令Q.rear=0, 則可以利用已被刪除的元素空間。如下圖。

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

在循環(huán)隊(duì)列中,不可以根據(jù)等式front == rear可以判別隊(duì)滿和隊(duì)空。因?yàn)榇藭r條件是相同的,解決這種問題的方法一般有兩種。

少用(損失)一個空間,以尾指針加1等于頭指針作為隊(duì)滿的標(biāo)志。因此:當(dāng)front==rear,表示循環(huán)隊(duì)列為空;當(dāng)front ==(rear+1)% MAXLEN,表示循環(huán)隊(duì)列為滿。
在定義結(jié)構(gòu)體時,附設(shè)一個存儲循環(huán)隊(duì)列中元素個數(shù)的變量n,當(dāng)n==0時表示隊(duì)空;當(dāng)n==MAXLEN時為隊(duì)滿。

循環(huán)隊(duì)列的基本操作:

1. 初始化

Status initQueue (SqQueue *Q)
{
    Q.base=(QElemType *) malloc(MAXQSIZE * sizeof(QElemType));
    if (!Q.base) exit(OVERFLOW);
    Q.front = Q.rear = 0;
    return OK;
}

2. 求隊(duì)列長度

int queueLength(SqQueue *Q)
{
    return (Q.rear - Q.front+MAXQSIZE) % MAXQSIZE;
}

3. 入隊(duì)

Status enQueue (SqQueue *Q, QElemType e)
{
    if((Q.rear+1)%MAXQSIZE == Q.front)  return ERROR;
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear+1) % MAXQSIZE;
    return OK;
}

4. 出隊(duì)

Status deQueue (SqQueue *Q, QElemType e)
{
    if(Q.front == Q.rear)
    return ERROR;
    e = Q.base[Q.front];
    Q.front = (Q.front+1)%MAXQSIZE;
    return OK;
}

到此這篇關(guān)于C利用語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的文章就介紹到這了,更多相關(guān)C語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu) 隊(duì)列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一篇文章教你在C++中操作符可分為哪幾種類和用法

    一篇文章教你在C++中操作符可分為哪幾種類和用法

    這篇文章主要介紹了C++編程中操作符的種類和用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • C語言中cJSON的使用

    C語言中cJSON的使用

    JSON是一種輕量級的數(shù)據(jù)交換格式,常用于在網(wǎng)絡(luò)之間傳輸數(shù)據(jù),本文主要介紹了C語言中cJSON的使用,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • C++中實(shí)現(xiàn)WebSocket通信的兩種方法:libwebsockets庫、Boost.Beast?庫

    C++中實(shí)現(xiàn)WebSocket通信的兩種方法:libwebsockets庫、Boost.Beast?庫

    C++中WebSocket庫主要有以下幾個?:cpp-websocket?、asio_websocket?、websockets++?、?websocketpp?、?libwebsockets?、?uWebSockets?、Boost.Beast?、Simple-WebSocket-Server?,這篇文章使用libwebsockets庫、Boost.Beast?庫來實(shí)現(xiàn)c++中的WebSocket通信
    2025-01-01
  • c/c++ 標(biāo)準(zhǔn)庫 bind 函數(shù)詳解

    c/c++ 標(biāo)準(zhǔn)庫 bind 函數(shù)詳解

    bind是一組用于函數(shù)綁定的模板。在對某個函數(shù)進(jìn)行綁定時,可以指定部分參數(shù)或全部參數(shù),也可以不指定任何參數(shù),還可以調(diào)整各個參數(shù)間的順序。這篇文章主要介紹了c/c++ 標(biāo)準(zhǔn)庫 bind 函數(shù) ,需要的朋友可以參考下
    2018-09-09
  • C語言函數(shù)調(diào)用的三種實(shí)現(xiàn)方法實(shí)例

    C語言函數(shù)調(diào)用的三種實(shí)現(xiàn)方法實(shí)例

    C語言中函數(shù)的調(diào)用主要有如下三種方法,直接調(diào)用,函數(shù)指針調(diào)用,函數(shù)指針傳遞調(diào)用其中后兩種本質(zhì)一樣,但在有無返回值時還稍有差別,下面這篇文章主要給大家介紹了關(guān)于C語言函數(shù)調(diào)用的三種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2022-01-01
  • Qt實(shí)現(xiàn)FTP的上傳和下載的實(shí)例代碼

    Qt實(shí)現(xiàn)FTP的上傳和下載的實(shí)例代碼

    本篇文章主要介紹了Qt實(shí)現(xiàn)FTP的上傳和下載的實(shí)例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • C語言楊輝三角兩種實(shí)現(xiàn)方法

    C語言楊輝三角兩種實(shí)現(xiàn)方法

    大家好,本篇文章主要講的是C語言楊輝三角兩種實(shí)現(xiàn)方法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++詳解如何通過模板實(shí)現(xiàn)元素的反序

    C++詳解如何通過模板實(shí)現(xiàn)元素的反序

    這篇文章主要介紹了C++中模板(Template)實(shí)現(xiàn)元素的反序,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • OpenCV4 實(shí)現(xiàn)背景分離的詳細(xì)步驟(背景減法模型)

    OpenCV4 實(shí)現(xiàn)背景分離的詳細(xì)步驟(背景減法模型)

    背景分離(BS)是一種通過使用靜態(tài)相機(jī)來生成前景掩碼(即包含屬于場景中的移動對象像素的二進(jìn)制圖像)的常用技術(shù),本文給大家介紹OpenCV4 實(shí)現(xiàn)背景分離的詳細(xì)步驟,需要的朋友可以參考下
    2021-09-09
  • C語言超詳細(xì)講解字符串相乘

    C語言超詳細(xì)講解字符串相乘

    這篇文章主要介紹了用C語言如何來實(shí)現(xiàn)字符串相乘的方法,這里我們會利用到memset函數(shù),memset函數(shù)是對較大的結(jié)構(gòu)體或數(shù)組進(jìn)行清零操作的一種最快方法,可以說是初始化內(nèi)存的“萬能函數(shù)”,下面我們詳細(xì)了解一下
    2022-03-03

最新評論

循化| 教育| 武定县| 鹤庆县| 壶关县| 玛曲县| 奉节县| 乐都县| 台中市| 宿州市| 拜泉县| 新巴尔虎左旗| 乌兰县| 五大连池市| 赣州市| 铁岭县| 上虞市| 彩票| 巫溪县| 长顺县| 方山县| 黔江区| 邢台县| 榆社县| 浠水县| 包头市| 武安市| 呼图壁县| 闽清县| 友谊县| 和龙市| 景洪市| 开化县| 通海县| 凉城县| 文安县| 含山县| 林周县| 育儿| 八宿县| 长治市|