最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言?棧與數(shù)組的實(shí)現(xiàn)詳解

 更新時(shí)間:2022年04月15日 16:18:52   作者:m0_52012656  
棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱為棧頂,相對(duì)地,把另一端稱為棧底。向一個(gè)棧插入新元素又稱作進(jìn)棧、入?;驂簵?,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素

棧的實(shí)現(xiàn)

首先我們思考一個(gè)問(wèn)題,什么是棧?

棧是數(shù)據(jù)結(jié)構(gòu)的一種,棧在我們?nèi)粘>幋a中遇到的非常多,很多人對(duì)棧的接觸可能僅僅局限在 遞歸使用的是棧 和 StackOverflowException,棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)(可以想象生化金字塔的牢房和生化角斗場(chǎng)的狗洞)。

棧的定義

棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱為棧頂,相對(duì)地,把另一端稱為棧底。向一個(gè)棧插入新元素又稱作進(jìn)棧、入?;驂簵?,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個(gè)棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素

棧的應(yīng)用廣泛,比如你的程序執(zhí)行查看調(diào)用堆棧、計(jì)算機(jī)四則加減運(yùn)算、算法的非遞歸形式、括號(hào)匹配問(wèn)題等等。所以棧也是必須掌握的一門(mén)數(shù)據(jù)結(jié)構(gòu)。最簡(jiǎn)單大家都經(jīng)歷過(guò),你拿一本書(shū)上下疊在一起,就是一個(gè)后進(jìn)先出的過(guò)程,你可以把它看成一個(gè)棧。下面我們介紹數(shù)組實(shí)現(xiàn)的棧兩種形式。

數(shù)組實(shí)現(xiàn)

靜態(tài)棧

一般不推薦使用這種方法,因?yàn)楫?dāng)空間不夠用時(shí),增容會(huì)有點(diǎn)麻煩,不實(shí)用。

typedef struct Stack
{ 
    STDataType _a[];  //STDataType 為int宏定義,當(dāng)然你也可以將它定義為其他類型,宏定義是為了換棧類型的時(shí)候方便一點(diǎn)
    int _top; // 棧頂
    int _capacity; // 容量
}Stack;

動(dòng)態(tài)棧

相比靜態(tài)棧,動(dòng)態(tài)??臻g不夠時(shí)可以直接時(shí)用realloc動(dòng)態(tài)擴(kuò)容,但是動(dòng)態(tài)擴(kuò)會(huì)有一定程度的消耗,我們會(huì)直接擴(kuò)容一倍,當(dāng)使用不完時(shí)會(huì)造成一定程度的空間浪費(fèi)。

typedef struct Stack
{ 
    STDataType* _a;//指向一塊開(kāi)辟出來(lái)的連續(xù)空間的指針
    int _top; // 棧頂
    int _capacity; // 容量
}Stack;

棧要實(shí)現(xiàn)的操作

// 初始化棧
void StackInit(Stack* ps);
// 入棧
void StackPush(Stack* ps, STDataType data);
// 出棧
void StackPop(Stack* ps);
// 獲取棧頂元素
STDataType StackTop(Stack* ps);
// 獲取棧中有效元素個(gè)數(shù)
int StackSize(Stack* ps);
// 檢測(cè)棧是否為空,如果為空返回非零結(jié)果,如果不為空返回0
bool StackEmpty(Stack* ps);
// 銷毀棧
void StackDestroy(Stack* ps);

棧的初始化

void StackInit(Stack* ps)
{
    ps->_a = NULL; //初始化時(shí)將指針指向空,此時(shí)沒(méi)有開(kāi)辟空間
    //這里可以將top賦值為0,也可以賦值為-1。
    ps->_top = -1;  //賦值為0時(shí)表示top為棧頂元素的下一個(gè)位置的下標(biāo),賦值為-1時(shí)top為棧頂元素的下標(biāo)
    ps->_capacity = 0; //棧的容量
}

入棧

void StackPush(Stack* ps, STDataType data)
{
    assert(ps);
    //考慮要不要增容
    //當(dāng)top為0時(shí)判斷條件為
    //if(ps->top==ps->_capacity)
    if (ps->_top+1 == ps->_capacity)//當(dāng)棧滿時(shí)進(jìn)入
    {
        //判斷當(dāng)前棧的容量是否為0,為0的話開(kāi)辟4個(gè)空間,不為0時(shí)擴(kuò)容一倍
        int newcapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;
        STDataType* tmp = realloc(ps->_a, sizeof(STDataType) * newcapacity);
        if (tmp == NULL)
        {
            exit(-1);
        }
        ps->_a = tmp;
        ps->_capacity = newcapacity;
    }
    //擴(kuò)容完成,或者不用擴(kuò)容,開(kāi)始插入
    ps->_top++;
    ps->_a[ps->_top] = data;
    //當(dāng)top為0時(shí)插入操作
    //ps->_a[ps->_top] = data;
    //ps->_top++;
}

出棧

void StackPop(Stack* ps)
{
    assert(ps);
    //判斷是否為空
    assert(!StackEmpty(ps));//暴力判斷
    //if (top==-1)//溫柔判斷
    //{
    //  printf("棧已經(jīng)空了!\n");
    //  exit(-1); //甩出異常
    //}
    ps->_top--;
}

取棧頂元素

STDataType StackTop(Stack* ps)
{
    assert(ps);
    //判斷是否為空,為空甩出異常。
    assert(!StackEmpty(ps));
    //if (!StackEmpty(ps)) {
    //  printf("棧為空!\n");
    //  exit(-1);
    //}
    return ps->_a[ps->_top]; //返回棧頂元素
}

判斷棧中有幾個(gè)有效數(shù)據(jù)

//取出棧里有效元素個(gè)數(shù)。
int StackSize(Stack* ps)
{
    assert(ps);
    return ps->_top+1; 
}

判斷棧是否為空

bool StackEmpty(Stack* ps)
{
    assert(ps);
    return ps->_top == -1;  //ps->_top為-1返回true,否則返回false.
?
}

銷毀棧

銷毀棧是必不可少的的一步,如果沒(méi)有銷毀的話會(huì)造成內(nèi)存泄露

void StackDestroy(Stack* ps)
{
    assert(ps);
    free(ps->_a);
    ps->_a = NULL;
    ps->_top = -1;
    ps->_capacity = 0;
}

鏈棧

最后介紹一下鏈棧,這里就不實(shí)現(xiàn)了有興趣的話可以自己實(shí)現(xiàn)一下。

鏈棧和鏈表一樣的,也是通指針將各個(gè)數(shù)據(jù)塊鏈接起來(lái)的

設(shè)計(jì)鏈棧是最好設(shè)計(jì)為雙向鏈表,否則當(dāng)你設(shè)計(jì)為用尾作棧頂是出棧效率低。

用頭做棧頂時(shí),頭插頭刪,可以設(shè)計(jì)為單鏈表。

到此這篇關(guān)于C語(yǔ)言 棧與數(shù)組的實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言 棧與數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • EasyX實(shí)現(xiàn)自由落體小球

    EasyX實(shí)現(xiàn)自由落體小球

    這篇文章主要為大家詳細(xì)介紹了EasyX實(shí)現(xiàn)自由落體小球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++貪心算法實(shí)現(xiàn)馬踏棋盤(pán)

    C++貪心算法實(shí)現(xiàn)馬踏棋盤(pán)

    這篇文章主要為大家詳細(xì)介紹了C++貪心算法實(shí)現(xiàn)馬踏棋盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • STL中vector的使用你了解嗎

    STL中vector的使用你了解嗎

    這篇文章主要為大家詳細(xì)介紹了STL中vector的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 解析C++編程中的選擇結(jié)構(gòu)和switch語(yǔ)句的用法

    解析C++編程中的選擇結(jié)構(gòu)和switch語(yǔ)句的用法

    這篇文章主要介紹了解析C++編程中的選擇結(jié)構(gòu)和switch語(yǔ)句的用法,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C語(yǔ)言實(shí)現(xiàn)abs和fabs絕對(duì)值

    C語(yǔ)言實(shí)現(xiàn)abs和fabs絕對(duì)值

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)abs和fabs絕對(duì)值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 基于Qt實(shí)現(xiàn)視頻播放器功能

    基于Qt實(shí)現(xiàn)視頻播放器功能

    本文通過(guò)實(shí)例代碼給大家介紹了基于Qt實(shí)現(xiàn)視頻播放器功能,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-09-09
  • c++面試題字符串拷貝函數(shù)示例

    c++面試題字符串拷貝函數(shù)示例

    這個(gè)也算是企業(yè)招工里面比較常見(jiàn)的一道筆試面試題了,非常簡(jiǎn)單。個(gè)人覺(jué)得考的主要是對(duì)指針使用的熟練程度,還有對(duì)字符串類內(nèi)部原理的掌握程度
    2013-12-12
  • c++ 盡量不要使用#define 而是用const、enum、inline替換。

    c++ 盡量不要使用#define 而是用const、enum、inline替換。

    為什么這么說(shuō)呢?或許很多程序員已經(jīng)習(xí)慣在文件開(kāi)始使用大量的#define語(yǔ)句
    2013-01-01
  • OpenCV實(shí)現(xiàn)摳圖工具

    OpenCV實(shí)現(xiàn)摳圖工具

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)摳圖工具,文中示例代碼介紹的非常詳細(xì),具有一定為大家詳細(xì)的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • iOS鎖屏音頻播放控制及音頻信息設(shè)置

    iOS鎖屏音頻播放控制及音頻信息設(shè)置

    這篇文章主要為大家詳細(xì)介紹了iOS鎖屏音頻播放控制及音頻信息設(shè)置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評(píng)論

略阳县| 隆昌县| 泸溪县| 大田县| 丰台区| 渑池县| 高密市| 思南县| 六盘水市| 东山县| 吕梁市| 隆尧县| 汉寿县| 汉源县| 信丰县| 滕州市| 淮北市| 凤阳县| 西城区| 江口县| 乐平市| 新民市| 广南县| 潜江市| 三江| 六枝特区| 新乡市| 搜索| 尼玛县| 德昌县| 德安县| 镇坪县| 祁门县| 富宁县| 瑞昌市| 聊城市| 尉犁县| 安化县| 天等县| 富宁县| 水富县|