国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結構】循環(huán)隊列

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結構】循環(huán)隊列。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


?? 作者簡介:一名在后端領域學習,并渴望能夠學有所成的追夢人。
?? 個人主頁:蝸牛牛啊
?? 系列專欄:??數(shù)據(jù)結構、??C++
?? 學習格言:博觀而約取,厚積而薄發(fā)
?? 歡迎進來的小伙伴,如果小伙伴們在學習的過程中,發(fā)現(xiàn)有需要糾正的地方,煩請指正,希望能夠與諸君一同成長! ??


循環(huán)隊列

隊列又稱為"先進先出(FIFO)"線性表:插入操作只能在隊尾進行,刪除操作只能在隊首進行。

而循環(huán)隊列是隊列的一種特殊形式,循環(huán)隊列(也被稱為環(huán)形隊列)是一種線性數(shù)據(jù)結構,其操作表現(xiàn)基于先進先出原則,并且隊尾被連接在隊首之后以形成一個循環(huán)。

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

循環(huán)隊列固定大小,空間能夠重復利用。

循環(huán)隊列可以用數(shù)組或者鏈表實現(xiàn),那下面我們來分析一下哪種方式更好:

當我們想使用鏈表實現(xiàn)時,假設我們想要開辟的隊列長度為k = 4;front表示隊頭指針,rear表示隊尾指針:

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

由上圖可知,當rear和front 都指向同一個位置時隊列為空。

插入一個數(shù)據(jù)之后:

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

rear向后移動,此時我們知道rear指向的位置是最后一個數(shù)據(jù)的下一個位置。

那當我們一直插入數(shù)據(jù),直至隊列為滿:

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

但是當隊列滿的時候,我們發(fā)現(xiàn)rear 和 front也指向同一個位置。那當隊列為空和隊列為滿的時候,rear和front都指向同一個位置,我們怎么判斷此時隊列是滿還是空?

通過判斷front和rear是否為空可以嗎?不行,front和rear剛開始都會指向節(jié)點,不會為空。

解決方法:1.增加一個size或者flag解決;2.增加一個空余節(jié)點。

我們可以多開一個節(jié)點,不是哨兵位節(jié)點,和頭節(jié)點一樣,此時:

隊列為空時:

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

隊列滿時:

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

滿的時候不能再插入數(shù)據(jù),現(xiàn)在假設我們刪除兩個數(shù)據(jù):

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

再插入兩個數(shù)據(jù):

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

如果我們不斷pop,當rear和front指向同一個位置時,隊列就變?yōu)榭樟恕?/p>

那我們可以用單鏈表來實現(xiàn)循環(huán)隊列嗎?使用鏈表最不好解決的一個問題就是取隊尾數(shù)據(jù),單鏈表不容易取當前節(jié)點的前一個結點數(shù)據(jù),我們可以通過增加一個指針rear->prev指向前一個結點。

當我們想使用數(shù)組實現(xiàn)時,假設我們想要開辟的隊列長度為k = 4;front表示隊頭的下標,rear表示隊尾的下標:

使用數(shù)組實現(xiàn)同樣也面臨著front和rear相等時無法判斷隊列是空還是滿的問題,所以我們也可以通過增加一個size或者多開辟一個空間來解決該問題。

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

當我們插入一個數(shù)據(jù)后發(fā)現(xiàn)rear指向隊尾數(shù)據(jù)的下一個位置,在鏈表中存在的找隊尾問題,在這里找隊尾數(shù)據(jù)變得簡單。

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

當隊列為空時下標front == rear:

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

當隊列滿時可以通過公式(rear + 1) % (k + 1) == front來判斷隊列是否滿了:

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

插入數(shù)據(jù)在rear++之后可以通過rear % (k + 1)來計算插入數(shù)據(jù)之后rear的下標:

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

刪除數(shù)據(jù)可以在front++之后通過front % (k + 1)得出刪除數(shù)據(jù)之后front的下標:

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

練習:現(xiàn)有一循環(huán)隊列,其隊頭指針為front,隊尾指針為rear;循環(huán)隊列長度為N。其隊內有效長度為 ?

A (rear - front + N) % N + 1
B (rear - front + N) % N
C (rear - front) % (N + 1)
D (rear - front + N) % (N - 1)

假設隊列如下圖所示:

【數(shù)據(jù)結構】循環(huán)隊列,數(shù)據(jù)結構,數(shù)據(jù)結構,后端,開發(fā)語言

隊內有效長度為2,兩個指針相減得到的是兩個指針之間的元素個數(shù)(rear - front) = 2;上面的四個選項中代入計算只有B符合要求。

設計循環(huán)隊列

題目:設計循環(huán)隊列

設計你的循環(huán)隊列實現(xiàn)。 循環(huán)隊列是一種線性數(shù)據(jù)結構,其操作表現(xiàn)基于 FIFO(先進先出)原則并且隊尾被連接在隊首之后以形成一個循環(huán)。它也被稱為“環(huán)形緩沖器”。

循環(huán)隊列的一個好處是我們可以利用這個隊列之前用過的空間。在一個普通隊列里,一旦一個隊列滿了,我們就不能插入下一個元素,即使在隊列前面仍有空間。但是使用循環(huán)隊列,我們能使用這些空間去存儲新的值。

你的實現(xiàn)應該支持如下操作:

  • MyCircularQueue(k): 構造器,設置隊列長度為 k 。
  • Front: 從隊首獲取元素。如果隊列為空,返回 -1 。
  • Rear: 獲取隊尾元素。如果隊列為空,返回 -1 。
  • enQueue(value): 向循環(huán)隊列插入一個元素。如果成功插入則返回真。
  • deQueue(): 從循環(huán)隊列中刪除一個元素。如果成功刪除則返回真。
  • isEmpty(): 檢查循環(huán)隊列是否為空。
  • isFull(): 檢查循環(huán)隊列是否已滿。

示例:

MyCircularQueue circularQueue = new MyCircularQueue(3); // 設置長度為 3
circularQueue.enQueue(1);  // 返回 true
circularQueue.enQueue(2);  // 返回 true
circularQueue.enQueue(3);  // 返回 true
circularQueue.enQueue(4);  // 返回 false,隊列已滿
circularQueue.Rear();  // 返回 3
circularQueue.isFull();  // 返回 true
circularQueue.deQueue();  // 返回 true
circularQueue.enQueue(4);  // 返回 true
circularQueue.Rear();  // 返回 4

提示:

  • 所有的值都在 0 至 1000 的范圍內;
  • 操作數(shù)將在 1 至 1000 的范圍內;
  • 請不要使用內置的隊列庫。

思路:

可以使用數(shù)組的方式實現(xiàn)循環(huán)隊列,在結構體中定義一個一級指針int* arr、隊頭下標front、隊尾下標rear以及要開辟的隊列長度k;然后通過開辟空間及上面關于循環(huán)隊列的知識完成循環(huán)隊列的設計。

注:下面提供的代碼第一個是通過if來計算插入時rear下標和刪除時front下標的,第二個是通過公式計算的。

代碼1:

typedef struct {
    int* arr; //用來指向空間的指針
    int front;//隊頭下標
    int rear;//隊尾下標
    int k;//隊列長度
} MyCircularQueue;

構造器,設置隊列長度為 k
MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* r = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));//申請一個結構體指針
    int* tmp = (int*)malloc(sizeof(int) * (k + 1));//多開一個空間
    if(tmp == NULL)
    {
        perror("malloc");
        exit(0);
    }
    r->arr = tmp;//給指針賦值
    r->front = 0;//設置隊頭下標
    r->rear = 0;//設置隊尾下標
    r->k = k;//隊列長度
    return r;
}

//檢查循環(huán)隊列是否為空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    if(obj->rear == obj->front)//相等時為空
        return true;
    return false;
}
// 檢查循環(huán)隊列是否已滿
bool myCircularQueueIsFull(MyCircularQueue* obj) {
    if((obj->rear + 1)%( obj->k + 1) == obj->front)
        return true;
    return false;
}
//向循環(huán)隊列插入一個元素。如果成功插入則返回真
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))//隊列滿時不能再插入
        return false;
    obj->arr[obj->rear++] = value;//插入數(shù)據(jù)
    if(obj->rear > obj->k)//計算rear下標
    {
        obj->rear = 0;
    }
    return true;
}
//從循環(huán)隊列中刪除一個元素。如果成功刪除則返回真
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))//為空時不能刪除
        return false;
    obj->front++;
    if(obj->front > obj->k)//計算front下標
    {
        obj->front = 0;
    }
    return true;

}
//從隊首獲取元素。如果隊列為空,返回 -1
int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    return obj->arr[obj->front];
}
//獲取隊尾元素。如果隊列為空,返回 -1
int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    int n = obj->rear-1;
    if(n < 0)
    {
        n = obj->k;
    }
    return obj->arr[n];
}
//釋放空間
void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->arr);
    free(obj);
}

代碼2:文章來源地址http://www.zghlxwxcb.cn/news/detail-533210.html

typedef struct {
    int* arr; //用來指向空間的指針
    int front;//隊頭下標
    int rear;//隊尾下標
    int k;//隊列長度
} MyCircularQueue;
//構造器,設置隊列長度為 k 。
MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));//申請一個結構體指針
    obj->arr=(int*)malloc(sizeof(int)*(k+1));//開辟k+1個int空間用來存儲數(shù)據(jù),要多開辟一個
    obj->k=k;//隊列長度
    obj->front = obj->rear = 0;
    return obj;
}
//檢查循環(huán)隊列是否為空。
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    assert(obj);
    return obj->front == obj->rear; //相等時為空
}
// 檢查循環(huán)隊列是否已滿。
bool myCircularQueueIsFull(MyCircularQueue* obj) {
    assert(obj);
    return ((obj->rear+1)%(obj->k+1) == obj->front);
}

//向循環(huán)隊列插入一個元素。如果成功插入則返回真。
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    assert(obj);
    if(myCircularQueueIsFull(obj))//隊列滿時不能再插入
        return false;
    obj->arr[obj->rear++] = value;//插入數(shù)據(jù)
    obj->rear = obj->rear%(obj->k+1);//計算rear下標
    return true;
}
//從循環(huán)隊列中刪除一個元素。如果成功刪除則返回真。
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    assert(obj);
    if(myCircularQueueIsEmpty(obj))//為空時不能刪除
        return false;
    obj->front++;
    obj->front = obj->front % (obj->k+1);//計算front下標
    return true;
}
//從隊首獲取元素。如果隊列為空,返回 -1 。
int myCircularQueueFront(MyCircularQueue* obj) {
    assert(obj);
    if(myCircularQueueIsEmpty(obj))
        return -1;
    return obj->arr[obj->front];
}
//獲取隊尾元素。如果隊列為空,返回 -1 。
int myCircularQueueRear(MyCircularQueue* obj) {
    assert(obj);
    if(myCircularQueueIsEmpty(obj))
        return -1;
    return obj->arr[(obj->rear+obj->k)%(obj->k+1)];
} 

//釋放空間
void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->arr);
    free(obj);
}

到了這里,關于【數(shù)據(jù)結構】循環(huán)隊列的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 數(shù)據(jù)結構--隊列與循環(huán)隊列

    數(shù)據(jù)結構--隊列與循環(huán)隊列

    ? ? ? ? 隊列是什么,先聯(lián)想一下隊,排隊先來的人排前面先出,后來的人排后面后出;隊列的性質也一樣,先進隊列的數(shù)據(jù)先出,后進隊列的后出;就像圖一的樣子: ?圖1 ? ? ? ? 如圖1,1號元素是最先進的,開始出隊時,那么他就是最先出的,然后12進隊,就應該排在最

    2024年02月10日
    瀏覽(15)
  • 【數(shù)據(jù)結構和算法】--隊列的特殊結構-循環(huán)隊列

    【數(shù)據(jù)結構和算法】--隊列的特殊結構-循環(huán)隊列

    循環(huán)隊列是隊列的一種特殊結構,它的 長度是固定的 k ,同樣是 先進先出 ,理論結構是 首尾相連的環(huán)形循環(huán)結構 。其理論結構大致如下: 具體結構描述可以參考 LeetCode : 622. 設計循環(huán)隊列的題目要求,大致如下: 設計你的循環(huán)隊列實現(xiàn)。 循環(huán)隊列是一種 線性數(shù)據(jù)結構 ,

    2024年02月04日
    瀏覽(16)
  • 數(shù)據(jù)結構:循環(huán)隊列的實現(xiàn)(leetcode622.設計循環(huán)隊列)

    數(shù)據(jù)結構:循環(huán)隊列的實現(xiàn)(leetcode622.設計循環(huán)隊列)

    ? 目錄 一.循環(huán)隊列簡單介紹 二.用靜態(tài)數(shù)組實現(xiàn)循環(huán)隊列 1.數(shù)組循環(huán)隊列結構設計 2.數(shù)組循環(huán)隊列的堆區(qū)內存申請接口? 3.數(shù)據(jù)出隊和入隊的接口實現(xiàn) 4.其他操作接口 5.數(shù)組循環(huán)隊列的實現(xiàn)代碼總覽? 三.靜態(tài)單向循環(huán)鏈表實現(xiàn)循環(huán)隊列? 1.鏈表循環(huán)隊列的結構設計 2.創(chuàng)建靜態(tài)

    2024年02月03日
    瀏覽(21)
  • 【數(shù)據(jù)結構】循環(huán)隊列

    【數(shù)據(jù)結構】循環(huán)隊列

    ?? 作者簡介:一名在后端領域學習,并渴望能夠學有所成的追夢人。 ?? 個人主頁:蝸牛牛啊 ?? 系列專欄:??數(shù)據(jù)結構、??C++ ?? 學習格言:博觀而約取,厚積而薄發(fā) ?? 歡迎進來的小伙伴,如果小伙伴們在學習的過程中,發(fā)現(xiàn)有需要糾正的地方,煩請指正,希望能夠與

    2024年02月12日
    瀏覽(29)
  • 數(shù)據(jù)結構——循環(huán)隊列詳解

    數(shù)據(jù)結構——循環(huán)隊列詳解

    目錄 一、循環(huán)隊列的定義 二、 循環(huán)隊列的基本操作 三、循環(huán)隊列的實現(xiàn)? 1、循環(huán)隊列的定義 2、循環(huán)隊列的初始化? 3、循環(huán)隊列出隊? 4、循環(huán)隊列入隊? 5、隊列判空 6、 隊列判滿 7、取隊頭元素 8、輸出隊列? 9、求隊列長度? 四、完整代碼? 五、小結? 六、參考文獻 一、

    2024年02月04日
    瀏覽(17)
  • 數(shù)據(jù)結構--循環(huán)隊列、鏈隊

    //循環(huán)隊列數(shù)據(jù)結構 typedef struct { QElemType data[MaxQSize];//數(shù)據(jù)域 int front,rear; //隊頭隊尾指針 }SqQueue; //鏈隊結點數(shù)據(jù)結構 typedef struct QNode { int data;//數(shù)據(jù)域 struct QNode* next;//指針域 }QNode, * QueuePtr; typedef struct { struct QNode* front, * rear;//rear指針指向隊尾 用于入隊 front指針指向隊頭 用于

    2024年02月15日
    瀏覽(27)
  • 數(shù)據(jù)結構——循環(huán)隊列的實現(xiàn)

    數(shù)據(jù)結構——循環(huán)隊列的實現(xiàn)

    hello hello~ ,這里是大耳朵土土垚~???? ,歡迎大家點贊????關注????收藏?????? ?? 個人主頁:大耳朵土土垚的博客 ?? 所屬專欄:數(shù)據(jù)結構學習筆記 ??對于數(shù)據(jù)結構順序表、鏈表、堆有疑問的都可以在上面數(shù)據(jù)結構的專欄進行學習哦~ 有問題可以寫在評論區(qū)或者私信

    2024年03月24日
    瀏覽(23)
  • 九、數(shù)據(jù)結構——順序隊列中的循環(huán)隊列

    九、數(shù)據(jù)結構——順序隊列中的循環(huán)隊列

    一、循環(huán)隊列的定義 二、循環(huán)隊列的實現(xiàn) 三、循環(huán)隊列的基本操作 ①初始化 ②判空 ③判滿 ④入隊 ⑤出隊 ⑥獲取長度 ⑦打印 四、循環(huán)隊列的應用 五、全部代碼 在數(shù)據(jù)結構中,隊列(Queue)是一種常見的線性數(shù)據(jù)結構,遵循先進先出(First In First Out,F(xiàn)IFO)的原則。循環(huán)隊

    2024年02月15日
    瀏覽(25)
  • 數(shù)據(jù)結構第九彈---循環(huán)隊列

    數(shù)據(jù)結構第九彈---循環(huán)隊列

    順序隊列在使用過程中容易出現(xiàn)虛假的滿狀態(tài), 為了解決這個問題,就產生了一個較巧妙的方法,將順序隊列臆造為一個環(huán)狀的空間,稱之為循環(huán)隊列。循環(huán)隊列中指針和隊列元素之間的關系不變,我們只需要利用模運算就可以很容易實現(xiàn)指針的循環(huán)移動。但是循環(huán)隊列中存

    2024年01月16日
    瀏覽(15)
  • 數(shù)據(jù)結構OJ:設計循環(huán)隊列

    數(shù)據(jù)結構OJ:設計循環(huán)隊列

    本題為LeetCode上的經(jīng)典題目,題目要求我們設計一種循環(huán)隊列,滿足FIFO原則且隊尾被連接在隊首之后。 題目中介紹循環(huán)隊列的好處是可以重復利用空間,所以我們很容易想到在初始化時即開辟指定大小的空間,之后便不需要再開辟空間,只需后續(xù)銷毀即可。 首先我們要選擇

    2024年04月17日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包