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

【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題

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

【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題

??write in front??
??所屬專欄:初階數(shù)據(jù)結(jié)構(gòu)
???博客主頁:睿睿的博客主頁
???代碼倉庫:??VS2022_C語言倉庫
??您的點贊、關(guān)注、收藏、評論,是對我最大的激勵和支持?。?!
關(guān)注我,關(guān)注我,關(guān)注我,你們將會看到更多的優(yōu)質(zhì)內(nèi)容?。?/p>

【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題

前言

例題1:循環(huán)隊列

??棧兩種線性表示都能實現(xiàn),隊列呢?隊列適合使用鏈表實現(xiàn),使用順序結(jié)構(gòu)(即固定的連續(xù)空間)實現(xiàn)時會出現(xiàn)假溢出的問題,因此大佬們設(shè)計出了循環(huán)隊列,循環(huán)隊列就是為了解決順序結(jié)構(gòu)實現(xiàn)隊列假溢出問題的現(xiàn)在我們來看看用順序表實現(xiàn)隊列:

【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題
因為隊列長度有限,所以我們要及時的判斷什么時候隊列滿了。那么怎么判斷隊列是否滿了呢?
如果我們通過隊尾和隊頂是否相等來判斷是否填滿就會發(fā)現(xiàn),在隊列空的時候,隊尾也等于對隊頂。所以我們不能通過這種方法來判斷:
【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題
【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題
那么我們該如何解決呢?
方法1:

加一個size來計數(shù)

方法2:
多添加一個位置:

空的情況:
【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題
滿的情況:
【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題

下面我們就以方法2來實現(xiàn)代碼:

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

MyCircularQueue* myCircularQueueCreate(int k) 
{
    MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));

    obj->a=(int*)malloc(sizeof(int)*(k+1));
    obj->k=k;
    obj->front=obj->rear=0;
    return obj;
}

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

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->k+1);
        return true;
}
//出隊
bool myCircularQueueDeQueue(MyCircularQueue* obj) 
{
    if(myCircularQueueIsEmpty(obj))
        return false;
        ++obj->front;
        obj->front%=(obj->k+1);
        return true;

}

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

int myCircularQueueRear(MyCircularQueue* obj) 
{
    if(myCircularQueueIsEmpty(obj))
        return -1;

        return obj->a[(obj->rear-1+obj->k+1)%(obj->k+1)];
}

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

這里我們只要關(guān)注這幾點,其他的都很好實現(xiàn):

空的情況:
【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題
滿的情況:
【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題
??在這里我們學(xué)到了如何在數(shù)組里建立循環(huán)!那就是通過mod數(shù)組的長度,就可以使數(shù)組循環(huán)起來!

找隊尾:
【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題
??尾部其實就是rear的后面一個元素,即rear-1,但是當(dāng)rear等于0的時候,-1就會導(dǎo)致越界。對一個正數(shù)加a模a,得到的值不變。對于rear=0的時候進(jìn)行這個操作就會避免越界的情況。

例題2:用隊列實現(xiàn)棧

【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題
??要通過隊列表示棧就要熟知他們兩個各自的性質(zhì)。棧是有“先進(jìn)后出”的特點,隊列有“先進(jìn)先出的特點”,綜合她兩的特點,我們通過以下方法來實現(xiàn)數(shù)據(jù)的出入:
【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題

  1. 保持一個隊列為空,一個隊列存數(shù)據(jù)
  2. 出棧的時候把前面的數(shù)據(jù)導(dǎo)入空隊列,將最后一個數(shù)據(jù)pop出去。

具體實現(xiàn):(隊列的代碼之前寫過,就不展示了,詳細(xì):棧與隊列)


void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
void QueuePush(Queue* pq, QDatatype x);
void QueuePop(Queue* pq);
int QueueSize(Queue* pq);
bool QueueEmpty(Queue* pq);
QDatatype QueueFront(Queue* pq);
QDatatype QueueBack(Queue* pq);

typedef int QDatatype;

typedef struct QueueNode
{
	struct QueueNode* next;
	QDatatype data;
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
}Queue;


typedef struct 
{
    Queue q1;
    Queue q2;
} MyStack;


MyStack* myStackCreate() 
{
    MyStack*ptr=(MyStack*)malloc(sizeof(MyStack));
    if(ptr==NULL)
    {
        perror("malloc::fail");
        return 0;
    }
    QueueInit(&ptr->q1);
    QueueInit(&ptr->q2);

    return ptr;
}

void myStackPush(MyStack* obj, int x) 
{
    if(!QueueEmpty(&obj->q1))
    {
        QueuePush(&obj->q1,x);
    }
    else
    {
        QueuePush(&obj->q2,x);
    }
}

int myStackPop(MyStack* obj) 
{
    Queue*emptyQ=&obj->q1;
    Queue *noneQ=&obj->q2;
    if(!QueueEmpty(emptyQ))
    {
        emptyQ=&obj->q2;
        noneQ=&obj->q1;
    }
    while(QueueSize(noneQ)>1)
    {
        QueuePush(emptyQ,QueueFront(noneQ));
        QueuePop(noneQ);
    }
    int top=QueueBack(noneQ);
    QueuePop(noneQ);

    return top;
}

int myStackTop(MyStack* obj) 
{
    if(!QueueEmpty(&obj->q1))
    {
        return QueueBack(&obj->q1);
    }
    return QueueBack(&obj->q2);
}

bool myStackEmpty(MyStack* obj) 
{
    return QueueEmpty(&obj->q1)&&QueueEmpty(&obj->q2);
}

void myStackFree(MyStack* obj) {
    QueueDestroy(&obj->q1);
    QueueDestroy(&obj->q2);
    free(obj);
}

例題3:用棧實現(xiàn)隊列

【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題

將一個棧當(dāng)作輸入棧,用于壓入 push傳入的數(shù)據(jù);另一個棧當(dāng)作輸出棧,用于 pop 和peek 操作。

每次 pop 或 peek時,若輸出棧為空則將輸入棧的全部數(shù)據(jù)依次彈出并壓入輸出棧,這樣輸出棧從棧頂往棧底的順序就是隊列從隊首往隊尾的順序。

【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題
具體代碼實現(xiàn)

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top; // 棧頂
	int capacity; // 容量
}Stack;
// 初始化棧
void StackInit(Stack* ps);
// 入棧
void StackPush(Stack* ps, STDataType data);
// 出棧
void StackPop(Stack* ps);
// 獲取棧頂元素
STDataType StackTop(Stack* ps);
// 獲取棧中有效元素個數(shù)
int StackSize(Stack* ps);
// 檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0 
bool empty(Stack* ps);
// 銷毀棧
void StackDestroy(Stack* ps);
typedef struct 
{
    Stack pushST;
    Stack popST;
} MyQueue;

int myQueuePeek(MyQueue* obj) ;
MyQueue* myQueueCreate() 
{
    MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));
    if(obj==NULL)
    {
        perror("malloc::fail");
        return 0;
    }
    StackInit(&obj->pushST);
    StackInit(&obj->popST);

    return obj;
}

void myQueuePush(MyQueue* obj, int x) 
{
    assert(obj);
    StackPush(&obj->pushST,x);
}

int myQueuePop(MyQueue* obj) 
{
   int top=myQueuePeek(obj);
   StackPop(&obj->popST);
   return top;
}

int myQueuePeek(MyQueue* obj) 
{
    if(empty(&obj->popST))
    {
        while(!empty(&obj->pushST))
        {
            StackPush(&obj->popST,StackTop(&obj->pushST));
            StackPop(&obj->pushST);
        }
    }
    return StackTop(&obj->popST);
}

bool myQueueEmpty(MyQueue* obj) 
{
    return empty(&obj->pushST)&&empty(&obj->popST);
}

void myQueueFree(MyQueue* obj) {
    StackDestroy(&obj->pushST);
    StackDestroy(&obj->popST);

    free(obj);
}


例題4:括號匹配問題

【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題
我們遍歷給定的字符串 s。當(dāng)我們遇到一個左括號時,我們會期望在后續(xù)的遍歷中,有一個相同類型的右括號將其閉合。由于后遇到的左括號要先閉合,因此我們可以將這個左括號放入棧頂。

當(dāng)我們遇到一個右括號時,我們需要將一個相同類型的左括號閉合。此時,我們可以取出棧頂?shù)淖罄ㄌ柌⑴袛嗨鼈兪欠袷窍嗤愋偷睦ㄌ枴?strong>如果不是相同的類型,或者棧中并沒有左括號,那么字符串 s 無效,返回 False。

在遍歷結(jié)束后,如果棧中沒有左括號,說明我們將字符串 s中的所有左括號閉合,返回 True,否則返回 False。

注意到有效字符串的長度一定為偶數(shù),因此如果字符串的長度為奇數(shù),我們可以直接返回 False ,省去后續(xù)的遍歷判斷過程。
【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題

完整代碼:
【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題

總結(jié)

??這就是棧和隊列的相關(guān)oj題,你學(xué)會了嗎?
??更新不易,辛苦各位小伙伴們動動小手,??三連走一走???? ~ ~ ~ 你們真的對我很重要!最后,本文仍有許多不足之處,歡迎各位認(rèn)真讀完文章的小伙伴們隨時私信交流、批評指正!

專欄訂閱:
每日一題
c語言學(xué)習(xí)
算法
智力題
初階數(shù)據(jù)結(jié)構(gòu)
更新不易,辛苦各位小伙伴們動動小手,??三連走一走???? ~ ~ ~ 你們真的對我很重要!最后,本文仍有許多不足之處,歡迎各位認(rèn)真讀完文章的小伙伴們隨時私信交流、批評指正!

【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題文章來源地址http://www.zghlxwxcb.cn/news/detail-435854.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】棧與隊列經(jīng)典oj題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)經(jīng)典題目】—兩個隊列實現(xiàn)棧與兩個棧實現(xiàn)隊列

    【數(shù)據(jù)結(jié)構(gòu)經(jīng)典題目】—兩個隊列實現(xiàn)棧與兩個棧實現(xiàn)隊列

    ? ????????????????????????????????????????? 食用指南:本文在有C基礎(chǔ)的情況下食用更佳 ?? ?????????????????????????????????????????? 這就不得不推薦此專欄了: C語言 ??????????????????????????????????????????

    2024年02月13日
    瀏覽(17)
  • 【數(shù)據(jù)結(jié)構(gòu)】棧與隊列

    【數(shù)據(jù)結(jié)構(gòu)】棧與隊列

    棧:一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作。 進(jìn)行數(shù)據(jù)插入和刪除操作的一端稱為棧頂,另一端稱為棧底 。棧中的數(shù)據(jù)元素遵守后進(jìn)先出 LIFO (Last In First Out) 的原則。 壓棧:棧的插入操作叫做進(jìn)棧/壓棧/入棧, 入數(shù)據(jù)在棧頂 。 出棧:棧的刪除操

    2024年02月13日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)——棧與隊列

    數(shù)據(jù)結(jié)構(gòu)——棧與隊列

    目錄 一、棧 1.棧的定義 ?2.棧的分類與基本操作 1. 順序棧 2.鏈棧 3.棧與遞歸的實現(xiàn) 1.遞歸的簡單描述 2.遞歸過程及與棧的關(guān)聯(lián) 3.遞歸過程示意圖 二.隊列 1.隊列的定義 ?2.隊列的分類與基本操作 1.順序隊列 2.鏈隊列 3.循環(huán)隊列 1.假溢出 ?2.循環(huán)隊列 3.循環(huán)隊列相關(guān)操作實現(xiàn):

    2024年02月04日
    瀏覽(29)
  • 數(shù)據(jù)結(jié)構(gòu)和算法(4):棧與隊列

    棧(stack)是存放數(shù)據(jù)對象的一種特殊容器,其中的數(shù)據(jù)元素按線性的邏輯次序排列,故也可定義首、末元素。 盡管棧結(jié)構(gòu)也支持對象的插入和刪除操作,但其操作的范圍僅限于棧的某一特定端。 也就是說,若約定新的元素只能從某一端插入其中,則反過來也只能從這一端刪

    2024年02月09日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)之棧與隊列詳解

    數(shù)據(jù)結(jié)構(gòu)之棧與隊列詳解

    棧和隊列是一種特殊的線性結(jié)構(gòu),他與之前學(xué)的線性結(jié)構(gòu)不同,棧和隊列是擁有一種特殊規(guī)則的線性結(jié)構(gòu),雖然它是用數(shù)組或者鏈表實現(xiàn),但是只有符合這種規(guī)則才能被稱作棧或者隊列 棧:一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作。進(jìn)行數(shù)據(jù)插入和

    2024年01月16日
    瀏覽(32)
  • 【數(shù)據(jù)結(jié)構(gòu)】 棧與隊列的相互實現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】 棧與隊列的相互實現(xiàn)

    隊列與棧的操作算法是筆試面試中較為常見的題目。 本文將著重介紹平時面試中常見的關(guān)于隊列與棧的應(yīng)用題目,馬上要進(jìn)行秋招了。希望對你們有幫助 _?? 請你僅使用兩個隊列實現(xiàn)一個后入先出(LIFO)的棧,并支持普通棧的全部四種操作(push、top、pop 和 empty)。 實現(xiàn)

    2024年02月10日
    瀏覽(17)
  • 數(shù)據(jù)結(jié)構(gòu)例題代碼及其講解-棧與隊列

    棧Stack 后進(jìn)先出 ? 棧的結(jié)構(gòu)體定義及基本操作。 初始化 ? 這里初始化時是將棧頂指針指向-1,有些則是指向0,因此后續(xù)入棧出棧的代碼略微有點區(qū)別 判斷棧是否為空 壓棧操作 由于初始時棧頂指針指向-1,因此需要先變化棧頂指針,然后入棧操作; 且當(dāng)MaxSize為50時候,數(shù)

    2024年02月10日
    瀏覽(20)
  • C++數(shù)據(jù)結(jié)構(gòu)與算法——棧與隊列

    C++數(shù)據(jù)結(jié)構(gòu)與算法——棧與隊列

    C++第二階段——數(shù)據(jù)結(jié)構(gòu)和算法,之前學(xué)過一點點數(shù)據(jù)結(jié)構(gòu),當(dāng)時是基于Python來學(xué)習(xí)的,現(xiàn)在基于C++查漏補(bǔ)缺,尤其是樹的部分。這一部分計劃一個月,主要利用代碼隨想錄來學(xué)習(xí),刷題使用力扣網(wǎng)站,不定時更新,歡迎關(guān)注! 請你僅使用兩個棧實現(xiàn)先入先出隊列。隊列應(yīng)當(dāng)

    2024年02月20日
    瀏覽(24)
  • (詳解)數(shù)據(jù)結(jié)構(gòu)-----------棧與隊列 c語言實現(xiàn)

    (詳解)數(shù)據(jù)結(jié)構(gòu)-----------棧與隊列 c語言實現(xiàn)

    本章將會詳細(xì)講解以下知識點: 目錄 一:棧 ? ? ? ? 1:棧的定義,棧的特點 ? ? ? ? 2:用什么結(jié)構(gòu)來實現(xiàn)棧與原因的分析? ? ? ? ??3:? (超詳解)棧的常用接口并且附上測試用例 二:隊列 ? ? ? ? 1:隊列的定義,隊列的特點 ? ? ? ? 2:用什么結(jié)構(gòu)來實現(xiàn)隊列與原因的分析

    2024年02月11日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)內(nèi)容-----第四章 棧與隊列

    數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)內(nèi)容-----第四章 棧與隊列

    棧(Stack)是計算機(jī)科學(xué)中的一種抽象數(shù)據(jù)類型,它是一個只能在一端進(jìn)行插入和刪除操作的線性數(shù)據(jù)結(jié)構(gòu)。棧按照后進(jìn)先出(LIFO)的原則存儲數(shù)據(jù),即最后放入的元素最先被取出。類比物理世界中的堆疊物品,每次加入的物品都被放在上面,取出時也只能從上面取出,最后

    2024年02月07日
    瀏覽(16)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包