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

【數(shù)據(jù)結(jié)構(gòu)】帶你圖文結(jié)合深入棧和隊列,并具體分步實現(xiàn)

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】帶你圖文結(jié)合深入棧和隊列,并具體分步實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【數(shù)據(jù)結(jié)構(gòu)】帶你圖文結(jié)合深入棧和隊列,并具體分步實現(xiàn),初階數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,c語言,c++,開發(fā)語言

君兮_的個人主頁

勤時當勉勵 歲月不待人

C/C++ 游戲開發(fā)

Hello,米娜桑們,這里是君兮_,我們繼續(xù)來學習初階數(shù)據(jù)結(jié)構(gòu)的內(nèi)容,今天我們要講的是棧與隊列部分的內(nèi)容,這篇博客先講棧,隊列我們放到下次再講
好了,廢話不多說,開始今天的學習吧!

一.棧

1.棧的概念及結(jié)構(gòu)

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

  • 壓棧:棧的插入操作叫做進棧/壓棧/入棧,入數(shù)據(jù)在棧頂。
    出棧:棧的刪除操作叫做出棧。出數(shù)據(jù)也在棧頂
    【數(shù)據(jù)結(jié)構(gòu)】帶你圖文結(jié)合深入棧和隊列,并具體分步實現(xiàn),初階數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,c語言,c++,開發(fā)語言

  • 無論是入棧還是出棧,都遵循后進先出原則。

2.棧的實現(xiàn)方式

  • 棧的實現(xiàn)一般可以使用數(shù)組或者鏈表實現(xiàn),相對而言數(shù)組的結(jié)構(gòu)實現(xiàn)更優(yōu)一些。因為數(shù)組在尾上插入數(shù)據(jù)的不需要付出很大的代價。
    【數(shù)據(jù)結(jié)構(gòu)】帶你圖文結(jié)合深入棧和隊列,并具體分步實現(xiàn),初階數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,c語言,c++,開發(fā)語言
  • 如果使用鏈表方式實現(xiàn)的話,會出現(xiàn)一個問題,我們的棧實際上是通過尾插實現(xiàn)入棧的,也就是說在入棧時我們每一次都需要通過遍歷的方式找尾,或者使用雙頭循環(huán)鏈表的方式找尾,但是由于數(shù)組的連續(xù)性和支持隨機訪問,對比于鏈表無疑是更加方便的。因此,接下來內(nèi)容中的棧結(jié)構(gòu)我們就通過數(shù)組的方式實現(xiàn)。

3.棧的分類

  • 棧分為靜態(tài)棧和動態(tài)棧

靜態(tài)棧

// 下面是定長的靜態(tài)棧的結(jié)構(gòu),實際中一般不實用
typedef int STDataType;
#define N 10
typedef struct Stack
{
STDataType a[N];
int _top; // 棧頂
int _capacity; // 容量
}Stack;

動態(tài)棧

  • 動態(tài)棧是通過動態(tài)內(nèi)存開辟的方式實現(xiàn)的,由于支持動態(tài)內(nèi)存的變化,因此在實際應用中動態(tài)棧無疑是更好的選擇
typedef int STDataType;//方便以后修改棧中存儲的數(shù)據(jù)類型
typedef struct Stack
{
    STDataType* a;//數(shù)組
    int top;//存放棧中有效元素的個數(shù)
    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 StackEmpty(Stack* ps);
// 銷毀棧
void StackDestroy(Stack* ps);
//獲取棧底元素
STDataType StackTail(Stack* ps);

4.動態(tài)棧的實現(xiàn)

棧的初始化函數(shù) StackInit

  • 無論是什么數(shù)據(jù)結(jié)構(gòu),我們都得先初始化
// 初始化棧
void StackInit(Stack* ps)
{
    assert(ps);//斷言
    ps->a = NULL;//數(shù)組中還沒有元素
    //容量和有效元素都為0
    ps->capacity = 0;
    ps->top = 0;
}

入棧函數(shù) StackPush

// 入棧
void StackPush(Stack* ps, STDataType data)
{
    assert(ps);
    //判斷是否還有空間
    if (ps->capacity == ps->top)
    {
        int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//通過容量判斷此時棧中有沒有元素,如果沒有元素就申請4個字節(jié)的空間,如果有容量,但容量不夠時就把容量變?yōu)橹暗?倍
        STDataType* tmp = (STDataType*)realloc(ps->a, newCapacity* sizeof(STDataType));
        if (tmp == NULL)//判讀開辟空間是否成功
        {
            perror("realloc failed");
            exit(-1);
        }
        ps->a = tmp;//成功了就把這個新的空間給我們的a數(shù)組
        ps->capacity = newCapacity;//容量也要做相應的動態(tài)變化
    }
    ps->a[ps->top] = data;//往棧中存元素
    ps->top++;//有效元素++
}

【數(shù)據(jù)結(jié)構(gòu)】帶你圖文結(jié)合深入棧和隊列,并具體分步實現(xiàn),初階數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,c語言,c++,開發(fā)語言

  • 這里可能有些人對于動態(tài)內(nèi)存管理的內(nèi)容不夠了解,可以看看我這篇博客:【C語言進階】那些你必須掌握的C/C++要點——動態(tài)內(nèi)存管理(1)
  • 這里還有一點要提,這里為什么用realloc開辟空間而不是使用malloc呢?
  • 這里就涉及一些realloc的進階玩法
  • 我們知道realloc是用來修改動態(tài)開辟的內(nèi)存大小,但是當我們給它傳入的是一個空指針,它的功能與malloc就是相同的。

出棧的函數(shù) StackPop

// 出棧
void StackPop(Stack* ps)
{
    assert(ps);
    --ps->top;
}
  • 出棧就非常簡單啦,我們直接讓top減1就行,由于我們的數(shù)組是通過下標的方式訪問數(shù)組成員的,top只有減少就無法在找到相應的元素啦
    【數(shù)據(jù)結(jié)構(gòu)】帶你圖文結(jié)合深入棧和隊列,并具體分步實現(xiàn),初階數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,c語言,c++,開發(fā)語言

獲取棧頂元素的函數(shù) StackTop

// 獲取棧頂元素
STDataType StackTop(Stack* ps)
{
    assert(ps);
    assert(ps->top > 0);
    //有效元素為top,數(shù)組的下標得-1
    return ps->a[ps->top-1];
}
  • 我們棧中的元素是尾插的,因此最后一個元素就是我們的棧頂元素

獲取棧底元素 StackTail

  • 需要棧底的情況其實并不常見,我們會在某些特別情況下才會用到(比如我們之后會帶大家寫的oj題)
STDataType StackTail(Stack* ps)
{
   assert(ps);
   return ps->a[0];
}
  • 我們的元素是尾插進數(shù)組的,因此我們的首元素就是我們的棧底元素。

獲取棧中有效元素的個數(shù)的函數(shù) StackSize

// 獲取棧中有效元素個數(shù)
int StackSize(Stack* ps)
{
    assert(ps);
    return ps->top;
}
  • 我們在之前無論是入棧還是出棧都變化了我們的有效元素top,因此返回的top就是我們的有效元素個數(shù)。

判斷棧是否為空的函數(shù) StackEmpty

// 檢測棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0 
bool StackEmpty(Stack* ps)
{
    assert(ps);
    return ps->top == 0;
}
  • top存著我們的有效元素,因此可以通過判斷top是否為0來判斷棧是否為空

銷毀棧的函數(shù)

// 銷毀棧
void StackDestroy(Stack* ps)
{
    assert(ps);
    free(ps->a);//free掉動態(tài)開辟的數(shù)組
    ps->a = NULL;//置空
    ps->top = ps->capacity = 0;//把有效元素和容量全部清空
}
  • 我們的內(nèi)存是通過動態(tài)開辟出來的,因此當我們使用完后就必須把我們的申請的內(nèi)存給free掉防止內(nèi)存泄漏。

5.測試棧

  • 我們來試試的效果
void TestStack1()
{
    Stack ST;
    StackInit(&ST);
    StackPush(&ST, 10);
    StackPush(&ST, 20);
    StackPush(&ST, 30);
    while (!StackEmpty(&ST))
    {
        printf("%d ", StackTop(&ST));
        StackPop(&ST);
}
    
    StackDestroy(&ST);
   

}
int main()
{
    
    TestStack1();
    return 0;
}

【數(shù)據(jù)結(jié)構(gòu)】帶你圖文結(jié)合深入棧和隊列,并具體分步實現(xiàn),初階數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,c語言,c++,開發(fā)語言

總結(jié)

  • 今天的內(nèi)容到這里就結(jié)束了,如果你能理解之前講過的順序表,鏈表等,棧的內(nèi)容其實非常的簡單,想學好的話,一定要自己動手試試哦!!
  • 好了,如果你有任何疑問歡迎在評論區(qū)或者私信我提出,大家下次再見啦!

新人博主創(chuàng)作不易,如果感覺文章內(nèi)容對你有所幫助的話不妨三連一下這個新人博主再走唄。你們的支持就是我更新的動力?。?!

**(可莉請求你們?nèi)B支持一下博主?。?!點擊下方評論點贊收藏幫幫可莉吧)**

【數(shù)據(jù)結(jié)構(gòu)】帶你圖文結(jié)合深入棧和隊列,并具體分步實現(xiàn),初階數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),算法,c語言,c++,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-638246.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】帶你圖文結(jié)合深入棧和隊列,并具體分步實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】帶你深入理解棧

    【數(shù)據(jù)結(jié)構(gòu)】帶你深入理解棧

    棧是一種特殊的線性表。其只允許在固定的一端進行插入和刪除元素的操作,進行數(shù)據(jù)的插入和刪除的一端稱作 棧頂 ,另外一端稱作 棧底 。 棧不支持隨機訪問 ,棧的數(shù)據(jù)元素遵循 后進先出 的原則,即 LIFO(Late In First Out)。 也許有人曾經(jīng)聽說過 壓棧 和 入棧 的術(shù)語,以

    2024年02月03日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)】庖丁解牛,圖文結(jié)合帶你輕松上手帶頭循環(huán)鏈表

    【數(shù)據(jù)結(jié)構(gòu)】庖丁解牛,圖文結(jié)合帶你輕松上手帶頭循環(huán)鏈表

    君兮_的個人主頁 勤時當勉勵 歲月不待人 C/C++ 游戲開發(fā) Hello,米娜桑們,這里是君兮_,我們今天接著上回的單鏈表來講講帶頭雙向循環(huán)鏈表,這種鏈表也是我們在實際應用中最常用的幾種鏈表之一,學好這種鏈表是是非常重要的,我會盡量用通俗易懂的文字配合邏輯圖來幫助

    2024年02月14日
    瀏覽(24)
  • 深入淺出帶你玩轉(zhuǎn)棧與隊列——【數(shù)據(jù)結(jié)構(gòu)】

    深入淺出帶你玩轉(zhuǎn)棧與隊列——【數(shù)據(jù)結(jié)構(gòu)】

    W...Y的主頁??? 代碼倉庫分享??? 目錄 1.棧 1.1棧的概念及結(jié)構(gòu) 1.2棧的結(jié)構(gòu)特征圖? ?編輯?1.3棧的實現(xiàn) 1.3.1棧的初始化 1.3.2進棧 1.3.3出棧 1.3.4銷毀內(nèi)存 1.3.5判斷棧是否為空 1.3.5棧底元素的讀取 1.3.6棧中大小 1.4棧實現(xiàn)所有接口 2.隊列 2.1隊列的概念 2.2隊列的結(jié)構(gòu)? ?2.3隊列的實

    2024年02月11日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu) | 棧和隊列

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

    … ??????本文已收錄至:數(shù)據(jù)結(jié)構(gòu) | C語言 更多知識盡在此專欄中! 棧(Stack) 又名堆棧,它是一種運算受限的線性表,限定僅在表尾進行插入和刪除操作的線性表。 隊列(Queue) 也是一種特殊的線性表,特殊之處在于它只允許在表的前端(Front)進行刪除操作,而在表的

    2024年01月23日
    瀏覽(23)
  • [數(shù)據(jù)結(jié)構(gòu)】棧和隊列

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

    目錄 1.棧 1.1概念 1.2 棧的使用 1.3.棧的模擬實現(xiàn) 2.隊列 2.1概念 2.2隊列的使用 2.3隊列的模擬實現(xiàn) 2.4 循環(huán)隊列 2.5雙端隊列 ? 棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數(shù)據(jù)插入和刪除操作的一端稱為棧頂,另一端稱為棧底。棧中的數(shù)據(jù)元素

    2024年02月07日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu):棧和隊列

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

    朋友們、伙計們,我們又見面了,本期來給大家解讀一下棧和隊列方面的相關(guān)知識點,如果看完之后對你有一定的啟發(fā),那么請留下你的三連,祝大家心想事成! C 語 言 專 欄:C語言:從入門到精通 數(shù)據(jù)結(jié)構(gòu)專欄:數(shù)據(jù)結(jié)構(gòu) 個 人 主 頁 :??stackY、 目錄 前言:? 1.棧 1.1棧的

    2024年02月06日
    瀏覽(24)
  • 數(shù)據(jù)結(jié)構(gòu)--棧和隊列

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

    棧是一種常見的數(shù)據(jù)結(jié)構(gòu),它遵循 后進先出LIFO (Last In First Out)的原則。 進行數(shù)據(jù)插入和操作的一端稱為棧頂,另一端稱為棧底 。 壓棧 :棧的插入操作被稱為壓棧/進棧/入棧,入數(shù)據(jù)在棧頂。 出棧 :棧的刪除操作。出數(shù)據(jù)也在棧頂; ??梢杂?數(shù)組 或者是 鏈表 來實現(xiàn);

    2024年02月09日
    瀏覽(27)
  • 數(shù)據(jù)結(jié)構(gòu)---棧和隊列

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

    2024年01月18日
    瀏覽(35)
  • 數(shù)據(jù)結(jié)構(gòu)——棧和隊列

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

    目錄 ?一.前言 二.前文回顧 三.棧 3.1 棧的概念及結(jié)構(gòu) 3.2 棧的實現(xiàn) 3.2.1 初始化函數(shù) 3.2.2 銷毀函數(shù) 3.2.3 入棧函數(shù) 3.2.4 出棧函數(shù) 3.2.5 計算大小函數(shù) 3.2.6 空棧函數(shù) 3.2.7 獲取棧頂函數(shù) ?3.2.8 小測試 3.3 全部代碼 四.棧的練習 4.1 有效的括號 五.隊列 5.1隊列的概念及結(jié)構(gòu) 5.2 隊列的實

    2024年01月25日
    瀏覽(22)
  • 棧和隊列【數(shù)據(jù)結(jié)構(gòu)】

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包