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

手把手教你實現(xiàn)一個循環(huán)隊列(C語言)

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

這是一道leetcode關(guān)于隊列的經(jīng)典題:

622.?設(shè)計循環(huán)隊列https://leetcode.cn/problems/design-circular-queue/手把手教你實現(xiàn)一個循環(huán)隊列(C語言),題目,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言,leetcode,鏈表,數(shù)據(jù)結(jié)構(gòu)

思路:?

?大家注意這個題目要求,這個隊列是定長的,如果滿了則不能再添加數(shù)據(jù)。那么我們設(shè)計一個隊頭front和隊尾rear,每次添加數(shù)據(jù)rear向后走,這時就有一個問題,怎么區(qū)分空和滿呢?當最后一個數(shù)據(jù)入隊列之后,由于這是個循環(huán)隊列,rear會回到front這個位置。那么比較好的一種方法就是多開一個空間,滿的條件是rear+1==front。

手把手教你實現(xiàn)一個循環(huán)隊列(C語言),題目,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言,leetcode,鏈表,數(shù)據(jù)結(jié)構(gòu)

?手把手教你實現(xiàn)一個循環(huán)隊列(C語言),題目,數(shù)據(jù)結(jié)構(gòu),c語言,開發(fā)語言,leetcode,鏈表,數(shù)據(jù)結(jié)構(gòu)

實現(xiàn):

循環(huán)隊列的定義:

typedef struct {
    int K;
    int* a;
    int front;
    int rear;
} MyCircularQueue;

循環(huán)隊列的創(chuàng)建:

為隊列和數(shù)組創(chuàng)建空間,需要注意的是數(shù)組a的空間是K+1個,要多開一個.

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    //多開辟一個空間,用以區(qū)分空和滿
    obj->K=k;
    obj->a=(int*)malloc(sizeof(int)*(obj->K+1));
    obj->front=0;
    obj->rear=0;
    return obj;
}

判斷隊列是否為空:

如果front==rear則為空。

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

判斷隊列是否為滿:

如果rear+1==front則為滿,或者說(rear+1)%(k+1)==front。

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->rear+1)%(obj->K+1)==obj->front;
}

?數(shù)據(jù)入隊列:

先判斷隊列是否滿了,滿了則返回false。如果不滿則在rear這個位置上添加數(shù)據(jù),再把rear++,再將rear=rear%(k+1)。

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
        return false;
    obj->a[obj->rear]=value;
    obj->rear++;

    obj->rear=(obj->rear)%(obj->K+1);
    return true;
}

數(shù)據(jù)出隊列:

判斷一下隊列是否為空,空則返回false。出隊列直接將front++即可,再將front=front%(k+)。

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

取隊列頭部數(shù)據(jù):

int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else
        return obj->a[obj->front];
}

取隊列尾部數(shù)據(jù):

這里需要注意,尾部數(shù)據(jù)的位置是在rear-1這個位置,所以rear-1+k+1就是rear+k.

int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else
        return obj->a[(obj->rear+obj->K)%(obj->K+1)];
}

銷毀隊列:

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

完整代碼:

typedef struct {
    int K;
    int* a;
    int front;
    int rear;
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    //多開辟一個空間,用以區(qū)分空和滿
    obj->K=k;
    obj->a=(int*)malloc(sizeof(int)*(obj->K+1));
    obj->front=0;
    obj->rear=0;
    return obj;
}

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

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->rear+1)%(obj->K+1)==obj->front;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
        return false;
    obj->a[obj->rear]=value;
    obj->rear++;

    obj->rear=(obj->rear)%(obj->K+1);
    return true;
}

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

int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else
        return obj->a[obj->front];
}

int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return -1;
    else
        return obj->a[(obj->rear+obj->K)%(obj->K+1)];
}

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

這次的分享到這里就結(jié)束了,感謝大家的閱讀!文章來源地址http://www.zghlxwxcb.cn/news/detail-758989.html

到了這里,關(guān)于手把手教你實現(xiàn)一個循環(huán)隊列(C語言)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包