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

【數(shù)據(jù)結(jié)構(gòu)】鏈棧的基本操作(C語(yǔ)言)

這篇具有很好參考價(jià)值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】鏈棧的基本操作(C語(yǔ)言)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

零零總總搜索了一些關(guān)于鏈棧的資料,了解了鏈棧的基本操作,一直覺(jué)得別人寫(xiě)的代碼或多或少存在一些問(wèn)題,所以打算自己寫(xiě)一篇關(guān)于鏈棧的文章,也算是對(duì)所學(xué)知識(shí)的梳理和鞏固了。

首先說(shuō)明本文使用C語(yǔ)言進(jìn)行鏈棧的基本操作,鏈棧是無(wú)頭結(jié)點(diǎn)的。這里補(bǔ)充說(shuō)明一下,無(wú)頭結(jié)點(diǎn)的意思是,鏈棧的頭結(jié)點(diǎn)是存儲(chǔ)數(shù)據(jù)的,有頭結(jié)點(diǎn)的是頭結(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù)的,不了解的小伙伴可以先去學(xué)習(xí)一下單鏈表的內(nèi)容。

之所以在這里說(shuō)明,是因?yàn)槲铱催^(guò)不少文章寫(xiě)的鏈棧是帶頭結(jié)點(diǎn),有的還分不清到底有沒(méi)有頭結(jié)點(diǎn),導(dǎo)致我在學(xué)習(xí)的時(shí)候浪費(fèi)了不少時(shí)間,廢話(huà)不多說(shuō),以下進(jìn)入正題。

鏈棧的基本操作包括以下幾點(diǎn):

a. 棧的初始化

b. 棧的判空

c. 入棧

d. 出棧

e. 讀棧頂元素

f. 遍歷棧

g. 銷(xiāo)毀棧

定義一個(gè)結(jié)構(gòu)體,用來(lái)構(gòu)造鏈棧。


typedef struct StackNode{
    int data;//數(shù)據(jù)域,用來(lái)存放數(shù)據(jù)
    StackNode *next;//指針域,用來(lái)指向棧頂?shù)南乱粋€(gè)元素
}LinkStack;
LinkStack *LS;//定義一個(gè)LinkStack類(lèi)型的指針

一、初始化棧

鏈棧初始化首先要構(gòu)造一個(gè)空棧,先創(chuàng)建一個(gè)頭結(jié)點(diǎn),然后讓該頭結(jié)點(diǎn)的指針指向空,這里使用傳參的方式初始化棧。


void StackInit(LinkStack* &S)//這里傳入的參數(shù)是一個(gè)指針
{                            //要對(duì)傳入的參數(shù)進(jìn)行賦值操作,需要加一個(gè)取址符
    S = NULL;//直接讓S指向空,不能在這里像下面注釋的代碼一樣分配空間,否則無(wú)法完成判空操作
    /*S = (LinkStack *)malloc(sizeof(LinkStack *));
    if(S == NULL)
    {
        printf("Malloc Error!!!\n");
        return false;
    }
    S->next = NULL;
    return true;*/
}

二、棧的判空

直接判斷棧頂?shù)牡刂肥欠駷榭?/p>


bool StackIsEmpty(LinkStack* S)
{
    if(S == NULL)
        return true;
    return false;
}

三、入棧

入棧需要判斷是否為空,若為空棧,第一個(gè)入棧元素為棧頂,沒(méi)有下一元素,指向下一個(gè)元素的指針為空。


bool Stack_Push(LinkStack* &S,int PushData)
{
    if(S == NULL)//若棧為空
    {    
        S = (LinkStack *)malloc(sizeof(LinkStack));
        if(S == NULL)
        {
            printf("Malloc Error!!!\n");
            return false;
        }
        S->data = PushData;//給頭結(jié)點(diǎn)賦值
        S->next = NULL;//沒(méi)有下一個(gè)元素,指向空
        return true;
    }
    //棧不為空
    LinkStack *NewNode = (LinkStack)malloc(sizeof(LinkStack));
    if(NewNode == NULL)
    {
        printf("Malloc Error!!!\n");
        return false;
    }
    NewNode->data = S->data;//用新節(jié)點(diǎn)存儲(chǔ)當(dāng)前棧頂元素,包括指針
    NewNode->next = S->next;//讓NewNode成為當(dāng)前棧頂
    S->next = NewNode;//S的下一個(gè)元素為NewNode,S成為新的棧頂(S仍為棧頂)
    S->data = PushData;//記錄入棧元素
    return true;
}

四、出棧

出棧即為刪除棧頂


bool Stack_Pop(LinkStack* &S,int &PopData)//PopData用于記錄出棧元素
{
    if(S == NULL)//棧為空
? ? {
? ? ? ? printf("Stack Is Empty!!!\n");
? ? ? ? return false;
? ? }

? ? if(S->next == NULL)//最后一個(gè)元素
    {
        PopData = S->data;
        free(S);//釋放空間
        S = NULL;//防止成為野指針
        return true;
    }
    
    PopData = S->data;//通過(guò)PopData獲取出棧(棧頂)數(shù)據(jù)
    
? ? /*? ? 此處為寫(xiě)錯(cuò)部分的代碼
? ? LinkStack *TempNode = S->next;//出棧需要釋放棧頂,需要定義一個(gè)臨時(shí)變量
    
? ? S->next = TempNode->next;//棧頂元素出棧,下一個(gè)元素成為新的棧頂
    S->data = TempNode->data;
? ? */

? ? LinkStack *TempNode = S;//出棧需要釋放棧頂,需要定義一個(gè)臨時(shí)變量,存放舊棧頂?shù)牡刂泛椭羔樣?? ? 
? ? //此時(shí)TempNode為棧頂,其指向的下一個(gè)棧元素應(yīng)為新的棧頂
    S = TempNode->next;//棧頂元素出棧,下一個(gè)元素成為新的棧頂
    S->data = TempNode->next->data;

    free(TempNode);//釋放舊棧頂空間
    TempNode = NULL;//防止成為野指針

    return true;
}

五、讀取棧頂元素

讀取棧頂元素不同于出棧,只需要讀取棧頂元素,不需要釋放棧頂空間


bool Stack_Read(LinkStack* S,int &PopData)//PopData用于記錄出棧元素
{
? ? if(S == NULL)//棧為空,沒(méi)有元素可讀,返回false
? ? {
? ? ? ? printf("Stack Is Empty!!!\n");
? ? ? ? return false;
? ? }
? ? PopData = S->data;
? ? return;
}

六、遍歷棧

這里直接打印棧的所有元素,從棧頂?shù)綏5?/p>


//遍歷棧
void Stack_Traverse(LinkStack* S)
{
? ? if(S == NULL)//棧為空
? ? {
? ? ? ? printf("Stack Is Empty!!!\n");
? ? ? ? return;
? ? }
? ? if(S->next == NULL)//只有一個(gè)元素
? ? {
? ? ? ? printf("StackTop to StackBottom: %d\n",S->data);
? ? ? ? return;
? ? }
? ? LinkStack *p,*q;
? ? p = S;//p為q是上一個(gè)元素
? ? q = p->next;//q為p的下一個(gè)元素
? ? printf("StackTop to StackBottom: ");
? ? while(q->next != NULL)
? ? {
? ? ? ? printf("%d ",p->data);
? ? ? ? p = p->next;
? ? ? ? q = p->next;
? ? }
? ? printf("%d %d\n",p->data,q->data);
}

七、銷(xiāo)毀棧


void Stack_Destroy(LinkStack* &S)
{
? ? LinkStack *p = NULL;
? ? while(S != NULL)
? ? {
? ? ? ? P = S;
? ? ? ? S = S->next;
? ? ? ? free(p);
? ? }
? ? p = NULL;
? ? S = NULL;
}

需要注意的是,在釋放??臻g之后,需要將相應(yīng)的指針指向空,否則將會(huì)成為野指針,并且書(shū)寫(xiě)也不規(guī)范。學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的過(guò)程中我查閱了許多資料,發(fā)現(xiàn)許多博客的代碼存在這樣的問(wèn)題,這讓有那么一點(diǎn)強(qiáng)迫癥的我看的很不舒服,所以就打算自己寫(xiě)。

本文是我第一次寫(xiě)、第一次發(fā)表的文章,內(nèi)容很少,也很簡(jiǎn)潔,代碼完全是在網(wǎng)頁(yè)敲出來(lái),就看著偽代碼敲,有什么不對(duì)的請(qǐng)給位看官批評(píng)指正,謝謝!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-450129.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】鏈棧的基本操作(C語(yǔ)言)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】 順序棧的基本操作 (C語(yǔ)言版)

    【數(shù)據(jù)結(jié)構(gòu)】 順序棧的基本操作 (C語(yǔ)言版)

    目錄 一、順序棧 1、順序棧的定義: 2、順序棧的優(yōu)缺點(diǎn) 二、順序棧的基本操作算法(C語(yǔ)言)??? 1、宏定義 ?2、創(chuàng)建結(jié)構(gòu)體 3、順序棧的初始化? 4、順序棧的入棧 5、順序棧的出棧 6、取棧頂元素 7、棧的遍歷輸出 8、順序棧的判空 9、順序棧的判滿(mǎn) ?10、求順序棧長(zhǎng)度 11、順

    2024年01月24日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)】棧和隊(duì)列(棧的基本操作和基礎(chǔ)知識(shí))

    【數(shù)據(jù)結(jié)構(gòu)】棧和隊(duì)列(棧的基本操作和基礎(chǔ)知識(shí))

    ??個(gè)人主頁(yè): 秦jh__ https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 ???系列專(zhuān)欄: 《數(shù)據(jù)結(jié)構(gòu)》 https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482 目錄 ?前言 棧 棧的概念和結(jié)構(gòu) 棧的實(shí)現(xiàn) ?編輯 數(shù)組棧的實(shí)現(xiàn) 總的聲明 初始化 ?插入 刪除 取棧頂元素 銷(xiāo)毀 判斷是否為空

    2024年02月03日
    瀏覽(20)
  • 鏈棧的基本操作(超詳細(xì))

    鏈棧的基本操作(超詳細(xì))

    目錄 前言 一.鏈棧的定義? 二、鏈棧的c++語(yǔ)言結(jié)構(gòu)描述表示 三、鏈棧中基本操作的實(shí)現(xiàn)? 3.1鏈棧的初始化 3.2判斷鏈棧是否為空? 3.3求鏈棧的長(zhǎng)度? 3.4 鏈棧的入棧 3.4 鏈棧的出棧 3.5求棧頂元素? 3.6銷(xiāo)毀棧 四.鏈棧的具體實(shí)現(xiàn)? 五.測(cè)試結(jié)果 六、總結(jié)? 本文參考王卓老師的數(shù)據(jù)結(jié)

    2023年04月25日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)】順序棧的基本操作:出棧、入棧、取棧頂元素、輸出所有棧中元素、括號(hào)匹配題目

    【數(shù)據(jù)結(jié)構(gòu)】順序棧的基本操作:出棧、入棧、取棧頂元素、輸出所有棧中元素、括號(hào)匹配題目

    棧是限定僅在表位進(jìn)行插入或刪除操作的線(xiàn)性表。棧的表尾稱(chēng)為棧頂,表頭稱(chēng)為棧底。不含元素的棧稱(chēng)為空棧。 左圖為棧的示意圖,右圖為用鐵路調(diào)度表示棧。 如下是入棧至棧滿(mǎn)再進(jìn)行出棧的過(guò)程示意圖。值得注意的是,棧滿(mǎn)后,top指針指向的不是頂端元素,而是頂端的下

    2024年02月07日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu):使用順序棧的基本操作,實(shí)現(xiàn)十進(jìn)制轉(zhuǎn)為二進(jìn)制,十六進(jìn)制的轉(zhuǎn)換

    使用系統(tǒng)環(huán)境: 1:win10,使用工具dev 2:使用系統(tǒng)win10 3:參考書(shū)籍?dāng)?shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版——嚴(yán)蔚敏 吳偉民) ( 注意:此文章默認(rèn),學(xué)習(xí)者擁有一定的數(shù)據(jù)機(jī)構(gòu)棧,C語(yǔ)言的知識(shí),書(shū)籍第20頁(yè),2.1算法的代碼進(jìn)行一個(gè)簡(jiǎn)化。)

    2024年02月05日
    瀏覽(31)
  • 【數(shù)據(jù)結(jié)構(gòu)】圖的基本操作

    【數(shù)據(jù)結(jié)構(gòu)】圖的基本操作

    一、問(wèn)題描述 分別以鄰接矩陣和鄰接表作為存儲(chǔ)結(jié)構(gòu),實(shí)現(xiàn)以下圖的基本操作: 增加一個(gè)新結(jié)點(diǎn)v,Insert(G,v); 刪除頂點(diǎn)v及其相關(guān)的邊,Delete(G,v); 增加一條邊v,w,Insert(G,v,w); 刪除一條邊v,w,Delete(G,v,w); 二、設(shè)計(jì)思路 1、鄰接矩陣實(shí)現(xiàn): ????????鄰接矩陣實(shí)現(xiàn)圖的基本

    2024年02月06日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)--串的基本操作

    數(shù)據(jù)結(jié)構(gòu)--串的基本操作

    第五話(huà) 數(shù)據(jù)結(jié)構(gòu)之串 文章目錄 一、了解什么是串 二、串的基本特征 三、串的基本操作 串的初始化 串的輸出? 四、串的匹配模式 五、總結(jié) 串(即字符串)是一種特殊的線(xiàn)性表,在信息檢索、文本編輯等領(lǐng)域有廣泛的應(yīng)用。其特殊性體現(xiàn)在組成線(xiàn)性表的每個(gè)數(shù)據(jù)元素是單個(gè)

    2023年04月17日
    瀏覽(31)
  • 數(shù)據(jù)結(jié)構(gòu)--圖的基本操作

    數(shù)據(jù)結(jié)構(gòu)--圖的基本操作

    使用的存儲(chǔ)模式: 圖的基本操作: ? Adjacent(G,x,y):判斷圖G是否存在邊x, y或(x, y)。 ? Neighbors(G,x):列出圖G中與結(jié)點(diǎn)x鄰接的邊。 ? InsertVertex(G,x):在圖G中插入頂點(diǎn)x。 ? DeleteVertex(G,x):從圖G中刪除頂點(diǎn)x。 ? AddEdge(G,x,y):若無(wú)向邊(x, y)或有向邊x, y不存在,則向圖G中添加該

    2024年02月16日
    瀏覽(29)
  • 【數(shù)據(jù)結(jié)構(gòu)】串的基本操作及應(yīng)用

    【數(shù)據(jù)結(jié)構(gòu)】串的基本操作及應(yīng)用

    分別定義兩個(gè)結(jié)構(gòu)體——串的定長(zhǎng)順序存儲(chǔ)、串的堆式順序存儲(chǔ) ? 問(wèn)題: 1、編寫(xiě)函數(shù),串用定長(zhǎng)順序存儲(chǔ)表示來(lái)實(shí)現(xiàn)串的基本操作; 2、?編寫(xiě)串的匹配算法,實(shí)現(xiàn)查找功能。 算法思想闡述: BF 算法:首先S[1] 和T[1] 比較,若相等,則再比較S[2] 和T[2] ,一直到T[M] 為止;若

    2023年04月26日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包