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

什么?要求設計一個循環(huán)隊列?

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

什么?要求設計一個循環(huán)隊列?

??個人主頁:?? :???初階牛???
??推薦專欄:
??????C語言初階
??????C語言進階

??個人信條: ??知行合一
??本篇簡介:>:講解用c語言實現數據結構的循環(huán)隊列.

一、題目介紹:

先聲明一下:
題目來源:力扣(LeetCode)

題目名稱:設計循環(huán)隊列:題目鏈接
難度: 中等

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

循環(huán)隊列的一個好處是我們可以利用這個隊列之前用過的空間。在一個普通隊列里,一旦一個隊列滿了,我們就不能插入下一個元素,即使在隊列前面仍有空間。但是使用循環(huá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

二、接口函數的分析:

2.1 循環(huán)隊列的結構

typedef int Queuedate;
typedef struct {
    Queuedate* date;
    int front;//隊首下標
    int rear;//隊尾
    int k;//隊列的長度(固定的)
} MyCircularQueue;

剛開始設計循環(huán)隊列時:
什么?要求設計一個循環(huán)隊列?
為了顯示循環(huán)的模樣,更加形象的圖:
什么?要求設計一個循環(huán)隊列?

此時遇到了一個難題:

什么?要求設計一個循環(huán)隊列?

什么?要求設計一個循環(huán)隊列?
什么?要求設計一個循環(huán)隊列?

為了解決隊列判滿與判空沖突問題,這里選擇設計2:以多開一個空間為代價.

那有沒有辦法不開空間也能解決這個問題呢?

另外方案:
增加一個size指針,用于記錄循環(huán)隊列元素的實際元素個數.

滿隊列: size=k
空隊列: size為0的時候是空隊列

2.2 初始化"循環(huán)隊列"(myCircularQueueCreate)

步驟:

  1. 為使得myCircularQueueCreate函數生命周期結束后,obj(循環(huán)隊列)不被銷毀,所以需要動態(tài)申請(malloc)空間.
  2. obj(循環(huán)隊列)的date 指針申請k(容量)個單位的空間.
  3. front (隊首下標)和rear(待插入位置下標)設置初始狀態(tài)為0.
  4. 將參數k的值,存入obj(循環(huán)隊列)保存,作為循環(huán)隊列最大容量.
  5. 返回obj(循環(huán)隊列).

代碼:

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));;
    obj->date = (Queuedate*)malloc(sizeof(Queuedate) * (k + 1));
    if (obj->date == NULL)//如果開辟空間失敗
    {
        perror("obj malloc error");
    }
    //初始化時,隊首和隊尾都暫時賦值為0下標
    obj->front = obj->rear = 0;
	//記錄k的值,k表示循環(huán)隊列的容量.
    obj->k = k;
    return obj;
}

2.3 入隊(myCircularQueueEnQueue)

返回值說明:

true表示入隊成功.
false表示入隊失敗.

步驟:

1.進行入隊操作前,需要考慮隊滿情況(隊滿直接返回false入隊失敗).
2.在rear下標位置插入新元素value.
3. 由于這里是循環(huán)隊列,所以相比于普通的隊列,這里需要一個rear自增時需要使其能夠循環(huán)回0下標處.(重點)

什么?要求設計一個循環(huán)隊列?

此時rear=4,如果我們進行 %周期 操作
(rear++) % (k + 1)
= 5 % 5
=0
這樣,rear就可以重新從0開始循環(huán)了.

代碼實現:

bool bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if (myCircularQueueIsFull(obj))
    {
        return false;
    }
    obj->date[obj->rear] = value;
    //隊尾++,注意考慮回0情況.
    obj->rear = (obj->rear + 1) % (obj->k + 1);
    return true;
}

2.4 出隊(myCircularQueueDeQueue)

步驟解析:

  1. 隊列之前要考慮隊列是否為空,隊列為空返回false.
  2. front(隊首下標)向后移動一位.

由于是循環(huán)隊列,front也要考慮特殊情況,也需要能夠回0(%周期)操作.
什么?要求設計一個循環(huán)隊列?

2.5 取隊首、隊尾元素

隊首元素很簡單獲取,返回obj->date[obj->front]即可.
需要注意的是:如果循環(huán)隊列為空,這里規(guī)定隊首返回值-1;(題干有要求).

隊尾元素獲取稍微復雜一些,因為存在特殊情況,如下圖:
什么?要求設計一個循環(huán)隊列?
此時可以直接返回obj->date[rear-1] 嗎?
那豈不是date[-1]了,所以我們需要對rear進行處理.
rear - 1 + k + 1加上一套周期,那么:

0 - 1 + 5 % 5 = 4
似乎是滿足要求的.

可是,不要高興的太早了,我們?yōu)榱私鉀Q這一特殊情況進行了==+周期==,那普通情況呢?
什么?要求設計一個循環(huán)隊列?
rear - 1 + k + 1加上一套周期還對嗎?

2 - 1 + 5 = 6.

所以我們還需要進行==%周期==操作.
即完整的:obj->date[(obj->rear - 1 + obj->k + 1) % (obj->k + 1)];

int myCircularQueueFront(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj))//規(guī)定,如果隊列為空,則隊首是-1;
    {
        return -1;
    }
    return obj->date[obj->front];
}

int myCircularQueueRear(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj))//規(guī)定,如果隊列為空,則隊首是-1;
    {
        return -1;
    }
    return obj->date[(obj->rear - 1 + obj->k + 1) % (obj->k + 1)];
}

代碼實現:

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj))
    {
        return false;
    }
    obj->front = (obj->front + 1) % (obj->k + 1);
    return true;
}

2.6 循環(huán)隊列的判空、判滿:

在設計循環(huán)隊列的時候就考慮過這個問題,所以相信大家解決這兩個接口還是很簡單的吧!

判空:
front(隊首)和rear (待插入)指向相等時,為空.

判滿:

front(隊首)和rear (待插入)的下一個相等時為滿.(注意%周期哦).

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    if (obj->rear == obj->front)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    if ((obj->rear + 1) % (obj->k + 1) == obj->front)
    {
        return true;
    }
    else
    {
        return false;
    }
}

循環(huán)隊列的銷毀:

只需要將之前在堆區(qū)申請的兩次空間釋放即可.

void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->date);
    free(obj);
}

什么?要求設計一個循環(huán)隊列?文章來源地址http://www.zghlxwxcb.cn/news/detail-467277.html

三、總代碼:

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

typedef int Queuedate;
typedef struct {
    Queuedate* date;
    int front;//隊首下標
    int rear;//待插入位置的下標
    int k;//隊列的長度(固定的)
} MyCircularQueue;
bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));;
    obj->date = (Queuedate*)malloc(sizeof(Queuedate) * (k + 1));
    if (obj->date == NULL)
    {
        perror("obj malloc error");
    }
    obj->front = obj->rear = 0;
    obj->k = k;
    return obj;
}


bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if (myCircularQueueIsFull(obj))
    {
        return false;
    }
    obj->date[obj->rear] = value;
    //隊尾++
    obj->rear = (obj->rear + 1) % (obj->k + 1);
    return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj))
    {
        return false;
    }
    obj->front = (obj->front + 1) % (obj->k + 1);
    return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj))//如果隊列為空,則隊首是-1;
    {
        return -1;
    }
    return obj->date[obj->front];
}

int myCircularQueueRear(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj))//如果隊列為空,則隊首是-1;
    {
        return -1;
    }
    return obj->date[(obj->rear - 1 + obj->k + 1) % (obj->k + 1)];
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    if (obj->rear == obj->front)
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    if ((obj->rear + 1) % (obj->k + 1) == obj->front)
    {
        return true;
    }
    else
    {
        return false;
    }
}

void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->date);
    free(obj);
}


到了這里,關于什么?要求設計一個循環(huán)隊列?的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

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

相關文章

  • 力扣622:設計循環(huán)隊列(中等)

    力扣622:設計循環(huán)隊列(中等)

    目錄 思考 一,循環(huán)隊列的初始化myCircularQueueCreate 二,判斷是否為空myCircularQueueIsEmpty 三,判斷隊列是否滿了bool myCircularQueueIsFull 四,隊列的插入myCircularQueueEnQueue 五,隊列的刪除myCircularQueueDeQueue 六,隊列取頭元素和尾元素myCircularQueueFront? ?//? ?myCircularQueueRear 七,銷毀隊列

    2024年03月13日
    瀏覽(20)
  • 622. 設計循環(huán)隊列(中等系列)

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

    2024年02月11日
    瀏覽(21)
  • leetcode 622.設計循環(huán)隊列

    leetcode 622.設計循環(huán)隊列

    ?? leetcode鏈接:設計循環(huán)隊列 1?? 思路與圖解: 首先循環(huán)隊列是一個固定長度的隊列,如果用鏈表的實現的話,當隊列需要取隊尾的數據,則需要遍歷找到尾的前一個, 所以循環(huán)隊列比較優(yōu)的方案是用數組來實現。 又引出的問題是,如果當數據為空那么 head 指針和 tail

    2024年02月13日
    瀏覽(20)
  • 【刷題】622. 設計循環(huán)隊列

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

    2024年02月05日
    瀏覽(18)
  • 【力扣--622】設計循環(huán)隊列

    【力扣--622】設計循環(huán)隊列

    ??作者 : D. Star. ??專欄 : 數據結構 ??今日分享 : 丟臉其實并沒有那么可怕,我們可以從另一個角度來想:別人能夠記住我了,而且過了還有多少人能記得我呢?雖然這種出場不太優(yōu)雅?? 【力扣–622】設計循環(huán)隊列 設計你的循環(huán)隊列實現。 循環(huán)隊列是一種線性數據結構,

    2024年02月06日
    瀏覽(17)
  • leetcode622-設計循環(huán)隊列

    leetcode622-設計循環(huán)隊列

    ?本題重點: 1. 選擇合適的數據結構 2. 針對選擇的數據結構判斷“空”和“滿” 這兩點是不分先后次序的,在思考時應該被綜合起來。事實上,無論我們選擇鏈表還是數組,最終都能實現題中描述的“循環(huán)隊列”的功能,只不過選擇不同結構時,我們面臨和需要解決的問題

    2024年02月10日
    瀏覽(19)
  • 棧和隊列(二) 隊列的實現,用棧實現隊列,用隊列實現棧,設計循環(huán)隊列

    棧和隊列(二) 隊列的實現,用棧實現隊列,用隊列實現棧,設計循環(huán)隊列

    這里的隊列我們使用鏈式隊列,好處就是可以很方便的取出隊頭的元素。 使用順序隊列取出隊頭元素所花費的時間復雜度為O(N),把后面的元素向前移動一個下標所花費的時間。 鏈式隊列的存儲結構: 接口函數的實現 ` leetcode做題鏈接 主要思想:用兩個隊列來實現一個棧

    2024年02月11日
    瀏覽(21)
  • 數據結構OJ:設計循環(huán)隊列

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

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

    2024年04月17日
    瀏覽(24)
  • 【數據結構與算法】設計循環(huán)隊列

    【數據結構與算法】設計循環(huán)隊列

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

    2024年01月17日
    瀏覽(21)
  • 【數據結構與算法】用隊列實現棧&&用棧實現隊列&&設計循環(huán)隊列

    【數據結構與算法】用隊列實現棧&&用棧實現隊列&&設計循環(huán)隊列

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

    2024年01月20日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包