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

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等)

這篇具有很好參考價(jià)值的文章主要介紹了力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

思考

一,循環(huán)隊(duì)列的初始化myCircularQueueCreate

二,判斷是否為空myCircularQueueIsEmpty

三,判斷隊(duì)列是否滿了bool myCircularQueueIsFull

四,隊(duì)列的插入myCircularQueueEnQueue

五,隊(duì)列的刪除myCircularQueueDeQueue

六,隊(duì)列取頭元素和尾元素myCircularQueueFront? ?//? ?myCircularQueueRear

七,銷毀隊(duì)列myCircularQueueFree

本題要點(diǎn)

完整答案


一般我們?nèi)胧值?span style="color:#fe2c24;">隊(duì)列都是單項(xiàng)不循環(huán)的,所以我們會(huì)更傾向于選擇用鏈表來實(shí)現(xiàn),并且會(huì)選擇單鏈表來簡(jiǎn)化隊(duì)列先入先出的規(guī)則,但是這個(gè)題可能會(huì)顛覆你的認(rèn)知。

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

我們?cè)賮砜纯碿hargpt3.5給出的循環(huán)隊(duì)列的演示圖(足夠細(xì)致了):

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

思考

這個(gè)題要我們從0開始實(shí)現(xiàn)循環(huán)隊(duì)列,那再用單鏈表就不太可能了,因?yàn)檠h(huán)不了嘛。這個(gè)時(shí)候腦洞比較大的人比如我,就會(huì)想到很早做過的約瑟夫環(huán),單項(xiàng)循環(huán)鏈表,帶不帶頭無所謂的(帶頭反而浪費(fèi)空間)。

方案一:用單項(xiàng)循環(huán)鏈表。

可不可行呢,是循環(huán)了,但是不知道你們有沒有注意到函數(shù)的接口有一個(gè)Rear(獲取隊(duì)尾元素),單項(xiàng)的鏈表獲取隊(duì)尾元素是不是比較困難,還不如雙向循環(huán)鏈表。

那可不可以換成用雙向循環(huán)鏈表來彌補(bǔ)單項(xiàng)的不足呢!

方案二:用雙向循環(huán)鏈表

可以是解決了取為難的問題,但是鏈表的結(jié)點(diǎn)是不是要一個(gè)一個(gè)創(chuàng)建再連接起來,連成k個(gè),那鏈表實(shí)現(xiàn)的困難就是初始化困難很多,需要前后鏈接。再者,如果用鏈表來實(shí)現(xiàn)也不好判斷到底這個(gè)隊(duì)列是空的還是滿的,因?yàn)檠h(huán)了嘛。

方案三:用數(shù)組

在我們的眾多討論之下,選擇了用數(shù)組來實(shí)現(xiàn),優(yōu)勢(shì)1:數(shù)組的數(shù)據(jù)是連續(xù)的(參考順序表),不需要去一個(gè)一個(gè)鏈接。優(yōu)勢(shì)2:處理起來更簡(jiǎn)單,增刪改等操作都簡(jiǎn)單。

然后我們用類似之前雙指針的思路,設(shè)置一個(gè)Front為數(shù)組的開頭元素的序號(hào),一個(gè)Rear為數(shù)組的結(jié)尾元素的序號(hào),來判斷數(shù)組是否空和滿,但是這個(gè)Rear應(yīng)該指向尾元素的下一個(gè)位置來。

因?yàn)椋绻鸕ear不指向下一個(gè)元素那么當(dāng)隊(duì)列只有有一個(gè)元素的情況下Rear和Front的值是相同的,沒有元素的情況下(初始化)也是相同的。就無法判斷了。

我們選定了方法,也有了思路,那就來實(shí)現(xiàn)一下這個(gè)題:

一,循環(huán)隊(duì)列的初始化myCircularQueueCreate

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

這里說一下為什么要多創(chuàng)造一個(gè)空間,主要是來好判斷隊(duì)列滿了的情況,后面會(huì)解釋的。

為什么obj也要?jiǎng)?chuàng)建一個(gè)空間呢,我們直接在實(shí)現(xiàn)順序表時(shí)都沒有這樣操作呀,那是因?yàn)橛捎趏bj這個(gè)結(jié)構(gòu)體是在創(chuàng)建函數(shù)之外創(chuàng)建的,這個(gè)函數(shù)的參數(shù)沒有這個(gè)結(jié)構(gòu)體,也就是說這個(gè)obj是創(chuàng)建在棧區(qū)了,出了函數(shù)就銷毀了,malloc是重新創(chuàng)建在堆區(qū)的,只要程序不結(jié)束就不會(huì)消失,所以就要重新創(chuàng)建空間。所以如果直接寫:

MyCircularQueue obj;? ? //……? ?//? return &obj;,這樣obj作為函數(shù)里的臨時(shí)變量,出函數(shù)就被銷毀了,取地址再返回也是不行的?。?!

二,判斷是否為空myCircularQueueIsEmpty

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

紅色的為空出來的空間,也就是多創(chuàng)建的空間,如圖其實(shí)不難發(fā)現(xiàn)不管是有元素還是沒有元素,rear循環(huán)了還是沒有循環(huán),rear+1都==front。

三,判斷隊(duì)列是否滿了bool myCircularQueueIsFull

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

這里解釋一下為什么要多開辟一個(gè)空間來解決偽充滿的問題?。?!

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

如圖,當(dāng)rear的值增大到6時(shí)由于要循環(huán),所以rear%k = 0,為了讓數(shù)組循環(huán)起來,%數(shù)組的大小是最好的選擇,此時(shí)如果(rear + 1)% k = 1,這樣永遠(yuǎn)都不會(huì)等于front,無法判斷,如果rear不加上1直接去%,那么rear%k = 0 = front這樣無法判斷隊(duì)列是空的還是滿的。

如果不讓rear指向尾元素的下一個(gè),直接指向尾元素,這樣的話,當(dāng)rear等于5時(shí),最后一個(gè)數(shù)據(jù)進(jìn)入隊(duì)列,這樣手動(dòng)將rear+1 = 6,(rear + 1)% k = 0 = front;但是如果在進(jìn)數(shù)據(jù)時(shí)有數(shù)據(jù)被取出,那front就不是等于0,有可能等于1,2……這樣,front和rear依然不相等呀。

所以,多創(chuàng)建一個(gè)空間就是最好的選擇:由圖可知:rear+1 == front,由于在不循環(huán)的情況時(shí),rear+1一定不會(huì)大于k+1的所以%(k+1)也不會(huì)影響不循環(huán)的情況的,循環(huán)時(shí)為了防止rear一直加后越界,所以要%(k+1),這就是數(shù)組循環(huán)的條件!

四,隊(duì)列的插入myCircularQueueEnQueue

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

插入時(shí)需要先判斷隊(duì)列是否為滿的情況。

如果rear此時(shí)等于k時(shí),如果前面沒有足夠的空位,那就需要考慮循環(huán)的問題就要%(k+1),不然就會(huì)越界訪問。如果沒有循環(huán)的問題那只需要插入在rear的位置就行,這個(gè)空格會(huì)一直出現(xiàn)在front的后面用以判斷是否滿了,空格就是多出來的空間。

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

五,隊(duì)列的刪除myCircularQueueDeQueue

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

刪除則要考慮隊(duì)列是否為空。剩下的思路和上面的插入差不多?。?!

六,隊(duì)列取頭元素和尾元素myCircularQueueFront? ?//? ?myCircularQueueRear

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

取頭尾元素都要先考慮隊(duì)列是否為空,但是由于取頭元素只要a[obj->Front],因?yàn)閒ront沒有什么變化,都對(duì)應(yīng)著要取的數(shù),那取尾會(huì)不會(huì)一樣呢?

細(xì)心的你當(dāng)然會(huì)發(fā)現(xiàn)肯定不是,如果沒有循環(huán)是這樣沒錯(cuò),但是如果rear循環(huán)就不一樣了。

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

如圖,如果rear循環(huán),那正常rear-1就是尾,但是如果rear=0,那rear+1=-1,所以需要加上一個(gè)隊(duì)列的大?。╧+1)使其轉(zhuǎn)正后再%(k+1),%(k+1)是為了防止rear越界,即使是不循環(huán)或者循環(huán)且rear不等于0的情況,加上一個(gè)隊(duì)列的大小再%這個(gè)隊(duì)列的大小值也是不變的。上圖的算數(shù)式可以更好的證明?。?!

七,銷毀隊(duì)列myCircularQueueFree

力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等),leetcode,算法

為什么不直接free(obj)呢?

分析obj的結(jié)構(gòu)可得,因?yàn)閛bj這個(gè)結(jié)構(gòu)體里面有a數(shù)組,如果直接free(obj),是只把obj所占的空間銷毀了,但是里面的a數(shù)組的空間沒有被銷毀。

本題要點(diǎn)

本題主要是對(duì)于rear和front在移動(dòng)時(shí)會(huì)不會(huì)越界的判斷,和循環(huán)數(shù)組的處理方式(%(k+1)),rear-1越界的處理方式(+(k+1)),還需要更細(xì)致的判斷能力和理解循環(huán)隊(duì)列的循環(huán)結(jié)構(gòu)。難度中等實(shí)至名歸。

完整答案

這樣本題就解析+解答結(jié)束。下面為完整的解答過程。

typedef struct {

? ? int Front;

? ? int Rear;

? ? int* a;

? ? int capacity;

} MyCircularQueue;

MyCircularQueue* myCircularQueueCreate(int k)

{

? ? MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));

? ? obj->Front = 0;

? ? obj->Rear = 0;

? ? obj->capacity = k + 1;

? ? obj->a = (int*)malloc(sizeof(int) * obj->capacity);

? ? return obj;

}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {

? ? if ((obj->Rear+1) % obj->capacity == obj->Front)

? ? {

? ? ? ? return false;

? ? }

? ? else

? ? {

? ? ? ? obj->a[obj->Rear] = value;

? ? ? ? obj->Rear = obj->Rear+1;

? ? ? ? obj->Rear = obj->Rear % obj->capacity;

? ? ? ? return true;

? ? }

}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {

? ? if (obj->Rear == obj->Front) {

? ? ? ? return false;

? ? }

? ? obj->Front = (obj->Front + 1) % obj->capacity;

? ? return true;

}

int myCircularQueueFront(MyCircularQueue* obj) {

? ? if (obj->Rear == obj->Front) {

? ? ? ? return -1;

? ? }

? ? return obj->a[obj->Front];

}

int myCircularQueueRear(MyCircularQueue* obj)

{

? ? if (obj->Rear == obj->Front)

? ? {

? ? ? ? return -1;

? ? }

? ? else

? ? {

? ? ? ? return obj->a[(obj->Rear-1 + obj->capacity) % obj->capacity];

? ? }

}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {

? ? return obj->Rear == obj->Front;

}

bool myCircularQueueIsFull(MyCircularQueue* obj) {

? ? return (obj->Rear+1) % obj->capacity == obj->Front;

}

void myCircularQueueFree(MyCircularQueue* obj) {

? ?free(obj->a);

? ?free(obj);

}


?

/**

?* Your MyCircularQueue struct will be instantiated and called as such:

?* MyCircularQueue* obj = myCircularQueueCreate(k);

?* bool param_1 = myCircularQueueEnQueue(obj, value);

?* bool param_2 = myCircularQueueDeQueue(obj);

?* int param_3 = myCircularQueueFront(obj);

?* int param_4 = myCircularQueueRear(obj);

?* bool param_5 = myCircularQueueIsEmpty(obj);

?* bool param_6 = myCircularQueueIsFull(obj);

?* myCircularQueueFree(obj);

*/文章來源地址http://www.zghlxwxcb.cn/news/detail-839108.html

到了這里,關(guān)于力扣622:設(shè)計(jì)循環(huán)隊(duì)列(中等)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu):循環(huán)隊(duì)列的實(shí)現(xiàn)(leetcode622.設(shè)計(jì)循環(huán)隊(duì)列)

    數(shù)據(jù)結(jié)構(gòu):循環(huán)隊(duì)列的實(shí)現(xiàn)(leetcode622.設(shè)計(jì)循環(huán)隊(duì)列)

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

    2024年02月03日
    瀏覽(21)
  • 【刷題】622. 設(shè)計(jì)循環(huán)隊(duì)列

    622. 設(shè)計(jì)循環(huán)隊(duì)列 設(shè)計(jì)你的循環(huán)隊(duì)列實(shí)現(xiàn)。 循環(huán)隊(duì)列是一種線性數(shù)據(jù)結(jié)構(gòu),其操作表現(xiàn)基于 FIFO(先進(jìn)先出)原則并且隊(duì)尾被連接在隊(duì)首之后以形成一個(gè)循環(huán)。它也被稱為“環(huán)形緩沖器”。 循環(huán)隊(duì)列的一個(gè)好處是我們可以利用這個(gè)隊(duì)列之前用過的空間。在一個(gè)普通隊(duì)列里,一

    2024年02月05日
    瀏覽(18)
  • 力扣設(shè)計(jì)循環(huán)隊(duì)列

    力扣設(shè)計(jì)循環(huán)隊(duì)列

    目錄 1.使用了數(shù)組來表達(dá)循環(huán) 2.循環(huán)隊(duì)列是否為空 3.循環(huán)隊(duì)列是否已滿。 4.初始化 5.向循環(huán)隊(duì)列插入一個(gè)元素。如果成功插入則返回真 ? ? ? ? ? ? ? ? ? ? ? ? ?6.從隊(duì)首獲取元素。如果隊(duì)列為空,返回 -1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??7.獲取隊(duì)尾元素。如果隊(duì)列為

    2024年02月07日
    瀏覽(11)
  • 數(shù)據(jù)結(jié)構(gòu)刷題訓(xùn)練:設(shè)計(jì)循環(huán)隊(duì)列(力扣OJ)

    數(shù)據(jù)結(jié)構(gòu)刷題訓(xùn)練:設(shè)計(jì)循環(huán)隊(duì)列(力扣OJ)

    目錄 文章目錄 前言 1. 題目:設(shè)計(jì)循環(huán)隊(duì)列 2. 思路 3. 分析 ?3.1 定義循環(huán)隊(duì)列 ?3.2 創(chuàng)建隊(duì)列 ?3.3 判空和判滿 ?3.4 入隊(duì) ?3.5 出隊(duì) ?3.6 取隊(duì)頭隊(duì)尾數(shù)據(jù) ?3.7 銷毀隊(duì)列 ?4. 題解 總結(jié) ????????當(dāng)談到隊(duì)列數(shù)據(jù)結(jié)構(gòu)時(shí),很多人可能會(huì)想到普通的隊(duì)列,即先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)

    2024年02月13日
    瀏覽(22)
  • leetcode——設(shè)計(jì)循環(huán)隊(duì)列

    leetcode——設(shè)計(jì)循環(huán)隊(duì)列

    設(shè)計(jì)循環(huán)隊(duì)列 這個(gè)題目在這里小編只分享一個(gè)解題思路,因?yàn)檫€有一個(gè)思路小編還在嘗試,一直過不了,還在這里不斷嘗試,等我試出來的時(shí)候我在分享給大家,首先我們?cè)谶@里給出的是數(shù)組的形式,后面在分享單鏈表的思路,因?yàn)閿?shù)組在內(nèi)存上是連續(xù)的,這里給出的思路是

    2024年02月05日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)】如何設(shè)計(jì)循環(huán)隊(duì)列?圖文解析(LeetCode)

    【數(shù)據(jù)結(jié)構(gòu)】如何設(shè)計(jì)循環(huán)隊(duì)列?圖文解析(LeetCode)

    LeetCode鏈接:622. 設(shè)計(jì)循環(huán)隊(duì)列 - 力扣(LeetCode) 目錄 做題思路 只開辟 k 個(gè)空間 多開一個(gè)空間 代碼實(shí)現(xiàn) 1. 循環(huán)隊(duì)列的結(jié)構(gòu) 2. 開辟空間 3. 判斷空 4. 判斷滿 5. 隊(duì)尾插入數(shù)據(jù) 6. 隊(duì)頭刪除數(shù)據(jù) 7. 獲取隊(duì)頭元素 8. 獲取隊(duì)尾元素 9. 銷毀隊(duì)列 全部代碼 設(shè)計(jì)循環(huán)隊(duì)列,使用數(shù)組或鏈表

    2024年02月10日
    瀏覽(23)
  • leetcode 622. 設(shè)計(jì)循環(huán)鏈表

    leetcode 622. 設(shè)計(jì)循環(huán)鏈表

    這道題講了兩種方法,第一個(gè)代碼是用數(shù)組實(shí)現(xiàn)的,第二個(gè)是用鏈表實(shí)現(xiàn)的,希望對(duì)你們有幫助 (最好在VS自己測(cè)試一遍,再放到 leetcode上哦) 下面的是主函數(shù)(作參考),靜下心來慢慢測(cè)試 設(shè)計(jì)你的循環(huán)隊(duì)列實(shí)現(xiàn)。 循環(huán)隊(duì)列是一種線性數(shù)據(jù)結(jié)構(gòu),其操作表現(xiàn)基于 FIFO(先

    2024年02月05日
    瀏覽(15)
  • 【LeetCode力扣】11. 盛最多水的容器 (中等)

    【LeetCode力扣】11. 盛最多水的容器 (中等)

    ? 目錄 1、題目介紹 2、解題 2.1、解題思路 ?2.2、圖解說明 ?2.3、解題代碼 原題鏈接: 11. 盛最多水的容器 - 力扣(LeetCode) 示例 2: 提示: n == height.length 2 = n = 105 0 = height[i] = 104 這道題最優(yōu)的方法就是用雙指針,我們可以用指針 left 和指針 right 分別指向數(shù)組 height[ ] 的第一

    2024年02月06日
    瀏覽(18)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】設(shè)計(jì)循環(huán)隊(duì)列

    【數(shù)據(jù)結(jié)構(gòu)與算法】設(shè)計(jì)循環(huán)隊(duì)列

    ??????? 個(gè)人主頁:簡(jiǎn) 料 ???? 所屬專欄:C++ ???? 個(gè)人社區(qū):越努力越幸運(yùn)社區(qū) ???? 簡(jiǎn)? ? ?? 介: 簡(jiǎn)料簡(jiǎn)料,簡(jiǎn)單有料~在校大學(xué)生一枚,專注C/C++/GO的干貨分享,立志成為您的好幫手 ~ C/C++學(xué)習(xí)路線 (點(diǎn)擊解鎖) ?? C語言階段(已結(jié)束) ?? 數(shù)據(jù)結(jié)構(gòu)與算法(ing) ?

    2024年01月17日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】用隊(duì)列實(shí)現(xiàn)棧&&用棧實(shí)現(xiàn)隊(duì)列&&設(shè)計(jì)循環(huán)隊(duì)列

    【數(shù)據(jù)結(jié)構(gòu)與算法】用隊(duì)列實(shí)現(xiàn)棧&&用棧實(shí)現(xiàn)隊(duì)列&&設(shè)計(jì)循環(huán)隊(duì)列

    ?? 作者:@ 阿亮joy. ?? 專欄:《數(shù)據(jù)結(jié)構(gòu)與算法要嘯著學(xué)》 ?? 座右銘:每個(gè)優(yōu)秀的人都有一段沉默的時(shí)光,那段時(shí)光是付出了很多努力卻得不到結(jié)果的日子,我們把它叫做扎根 請(qǐng)你僅使用兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)后入先出(LIFO)的棧,并支持普通棧的全部四種操作(push、top、

    2024年01月20日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包