0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解數(shù)據(jù)結(jié)構(gòu)中棧的定義和操作

OSC開源社區(qū) ? 來源:OSCHINA 社區(qū) ? 2023-04-27 14:04 ? 次閱讀

1.棧的定義

棧(stack):是只允許在一端進(jìn)行插入或者刪除操作的線性表(即后進(jìn)先出,大概可以理解為吃飽了吐出來)

空棧:不含元素的空標(biāo)配

棧頂:表尾端

棧底:表頭端

dfc737aa-e4c0-11ed-ab56-dac502259ad0.png

進(jìn)棧順序:a1->a2->a3->a4->a5

出棧順序:a5->a4-a3->a2->a1

2. 對(duì)比線性表和棧基本操作

2.1 線性表的基本操作

InitList (&L): 初始化表。構(gòu)造一個(gè)空的線性表 L,分配內(nèi)存空間

DestoryList (&L): 銷毀操作。銷毀線性表,并且釋放線性表 L 所占用的空間

ListInsert (&L,i,e): 插入操作,在表 L 中的第 i 個(gè)位置上插入指定元素 e

ListDelete (&L,i,e): 刪除操作,刪除表 L 中的第 i 個(gè)位置的元素,并且用 e 返回刪除元素的值

LocateElem (L,e): 按值查找操作,在表 L 中查找具有給定關(guān)鍵字值的元素

GetElem (L,i): 按位查找操作,獲取表 L 中第 i 個(gè)位置的元素的值

2.2 棧的基本操作

InitStack (&S): 初始化棧,構(gòu)造一個(gè)空棧 S,分配內(nèi)存空間

DestoryStack (&S): 銷毀棧,銷毀并釋放棧 S 所占用的內(nèi)存空間

Push (&S,x): 進(jìn)棧,若棧 S 未滿,則將 x 加入使之成為新的棧頂

Pop (&S,&x): 出棧,若棧 S 非空,則彈出棧頂元素,并用 x 返回

GetTop (S,&x): 讀棧頂元素,若棧 S 非空,則用 x 返回棧頂元素

其他常見操作:StackEmpty (S): 判斷一個(gè)棧 S 是否為空,若 S 為空,則返回 true,否則返回 false

3. 順序棧

dfe74b12-e4c0-11ed-ab56-dac502259ad0.png

3.1 順序棧的定義

#define MaxSize 10           //定義棧中元素的最大個(gè)數(shù) 
typedef struct{
 ElemType data[MaxSize];   //靜態(tài)數(shù)組存放棧中的元素
    int top;      //棧頂指針
}SqStack;         //結(jié)構(gòu)體重命名

聲明一個(gè)順序棧后就會(huì)在內(nèi)存中分配一整片連續(xù)的空間,其中內(nèi)存大小為:MaxSize*sizeof (ELemType)

void testStack(){
 SqStack S; //聲明一個(gè)順序棧
}

3.2 棧的初始化操作

由于棧頂指針 top 需要指向此時(shí)棧頂元素,所以讓 top 指向 0 是不合理的,可以初始化讓 top 指向 - 1; 判斷一個(gè)棧是否為空,即判斷 S.top 是否等于 - 1 初始化棧:

void Inittack(SqStack){
 SqStack S;   //聲明一個(gè)順序棧
 S.top=-1;
}

判斷棧空:

bool StackEmpty(SqStack S){
    if(S.top==-1)      //???        return true;
    else 
        return false;  //非空
}

3.3 進(jìn)棧操作

分析:

判斷棧是否為空

棧頂指針 + 1

新元素入棧

bool Push(SqStack &S,ElemType x){
 if(S.top==NaxSize-1)
        return false;
 S.top+=1;
 S.data[S.top]=x;
        return true;
}

3.4 出棧操作

bool Push(SqStack &S,ElemType &x){
 if(S.top==-1)
        return false;
    x=S.data[S.top--];
        return true;
}

3.5 讀棧頂元素操作

bool GetTop(SqStack &S,ElemType &x){
 if(S.top==-1)
        return false;
    x=S.data[S.top];
        return true;
}

4. 共享?xiàng)?/strong>

兩個(gè)棧共享同一片空間

#define MaxSize 10           //定義棧中元素的最大個(gè)數(shù) 
typedef struct{
 ElemType data[MaxSize];   //靜態(tài)數(shù)組存放棧中的元素
    int top0;     //0號(hào)棧棧頂指針
    int top1;     //1號(hào)棧棧頂指針
}SqStack;         //結(jié)構(gòu)體重命名
初始化棧:
void InitStack(ShStack &S){
 S.top0=-1;
 S.top1=MaxSize;
}

5. 鏈棧的定義

進(jìn)棧 / 出棧都只能在棧頂一段進(jìn)行

鏈頭作為棧頂

typedef struct Linknode{
 ElemType data;           //數(shù)據(jù)域
    struct Linknode *next;   //指針域
}*LiStack                    //棧類型定義






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:詳解數(shù)據(jù)結(jié)構(gòu)中棧的定義和操作

文章出處:【微信號(hào):OSC開源社區(qū),微信公眾號(hào):OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一文詳解Linux的各種

    (push) 和 彈出 (pop) 操作。根據(jù)的特點(diǎn),很容易的想到可以利用數(shù)組,來實(shí)現(xiàn)這種數(shù)據(jù)結(jié)構(gòu)。但是本文要討論的并不是軟件層面的,而是硬件層面的
    發(fā)表于 09-28 14:51 ?1267次閱讀

    數(shù)據(jù)結(jié)構(gòu)

    1.數(shù)據(jù)結(jié)構(gòu)的概念 所謂數(shù)據(jù)結(jié)構(gòu)是指由某一數(shù)據(jù)對(duì)象及該對(duì)象中所有數(shù)據(jù)成員之間的關(guān)系組成的集合。成員之間的關(guān)系有很多種,最常見的是前后件關(guān)系。 2.
    發(fā)表于 03-04 14:13

    大話數(shù)據(jù)結(jié)構(gòu)pdf下載

    大話數(shù)據(jù)結(jié)構(gòu)是一本很值得初學(xué)者看的編程書籍,用簡(jiǎn)單的語(yǔ)言然人深刻的理解數(shù)據(jù)結(jié)構(gòu),強(qiáng)烈程序員推薦下載收藏,下面是部分內(nèi)容預(yù)覽: 完整的pdf格式電子書下載: 《大話數(shù)據(jù)結(jié)構(gòu)》.pdf
    發(fā)表于 07-04 00:33

    收藏 | 程序員面試,你必須知道的8大數(shù)據(jù)結(jié)構(gòu)

    本文我們介紹了應(yīng)對(duì)程序員面試過程,必須掌握的幾大數(shù)據(jù)結(jié)構(gòu)。幾乎所有的問題都需要面試者對(duì)數(shù)據(jù)結(jié)構(gòu)有深刻的理解。無論你是初入職場(chǎng)的新兵(剛從大學(xué)或者編程培訓(xùn)班畢業(yè)),還是擁有幾十年經(jīng)驗(yàn)的職場(chǎng)老鳥。有些
    發(fā)表于 09-30 09:35

    常見的數(shù)據(jù)結(jié)構(gòu)

    的,那樣對(duì)于數(shù)據(jù)的使用簡(jiǎn)直是個(gè)悲劇。針對(duì)此類數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu)提供了圖存儲(chǔ)結(jié)構(gòu),專門用于存儲(chǔ)這類數(shù)據(jù)。二、數(shù)
    發(fā)表于 05-10 07:58

    數(shù)據(jù)結(jié)構(gòu)之鏈?zhǔn)?b class='flag-5'>棧介紹

    數(shù)據(jù)結(jié)構(gòu)之鏈?zhǔn)?b class='flag-5'>棧鏈?zhǔn)?b class='flag-5'>棧鏈?zhǔn)?b class='flag-5'>棧的定義鏈?zhǔn)?b class='flag-5'>棧操作的實(shí)現(xiàn)鏈
    發(fā)表于 12-17 08:11

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

    嵌入式學(xué)習(xí)基礎(chǔ)-數(shù)據(jù)結(jié)構(gòu)鏈表的基本操作鏈表節(jié)點(diǎn)采用結(jié)構(gòu)體的方式進(jìn)行定義,下面是最基礎(chǔ)的定義只有一個(gè)數(shù)據(jù)
    發(fā)表于 12-22 08:05

    java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)

    數(shù)據(jù)結(jié)構(gòu)是對(duì)計(jì)算機(jī)內(nèi)存數(shù)據(jù)的一種安排,數(shù)據(jù)結(jié)構(gòu)包括 數(shù)組, 鏈表, , 二叉樹, 哈希表等,算法則對(duì)對(duì)這些
    發(fā)表于 11-29 09:46 ?731次閱讀

    什么是數(shù)據(jù)結(jié)構(gòu)?為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)?數(shù)據(jù)結(jié)構(gòu)的應(yīng)用實(shí)例分析

    本文檔的主要內(nèi)容詳細(xì)介紹的是什么是數(shù)據(jù)結(jié)構(gòu)?為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)的應(yīng)用實(shí)例分析包括了:數(shù)據(jù)結(jié)構(gòu)在串口通信當(dāng)中的應(yīng)用,數(shù)據(jù)結(jié)構(gòu)在按鍵
    發(fā)表于 09-26 15:45 ?14次下載
    什么是<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>?為什么要學(xué)習(xí)<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>?<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>的應(yīng)用實(shí)例分析

    什么是?數(shù)據(jù)結(jié)構(gòu)如何實(shí)現(xiàn)

    今天放松一下,我們來看看數(shù)據(jù)結(jié)構(gòu),這節(jié)的知識(shí)點(diǎn)可以說是數(shù)據(jù)結(jié)構(gòu)中最容易上手的知識(shí)點(diǎn)了,其實(shí)比起鏈表,其實(shí)鏈表也有和隊(duì)列的模型,鏈表的
    發(fā)表于 04-29 18:25 ?0次下載
    什么是<b class='flag-5'>棧</b>?<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b><b class='flag-5'>中</b><b class='flag-5'>棧</b>如何實(shí)現(xiàn)

    數(shù)據(jù)結(jié)構(gòu)堆棧出序列問題解析

    這是工作遇到的小問題。 數(shù)據(jù)結(jié)構(gòu)中有一種數(shù)據(jù)類型堆棧,該結(jié)構(gòu)數(shù)據(jù)項(xiàng)有如下特點(diǎn): 除了最前面
    的頭像 發(fā)表于 10-19 15:46 ?3190次閱讀
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b><b class='flag-5'>中</b>堆棧出<b class='flag-5'>棧</b>序列問題解析

    如何解決數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)最大頻率問題?

    讀完本文,可以去力扣解決如下題目: 895.最大頻率(Hard) ? 我個(gè)人很喜歡設(shè)計(jì)特殊數(shù)據(jù)結(jié)構(gòu)的問題,畢竟在工作中會(huì)經(jīng)常用到基本數(shù)據(jù)結(jié)構(gòu),而設(shè)計(jì)類的問題就非常考驗(yàn)對(duì)基本數(shù)據(jù)結(jié)構(gòu)
    的頭像 發(fā)表于 03-02 11:02 ?1344次閱讀

    SystemVerilog可以嵌套的數(shù)據(jù)結(jié)構(gòu)

    SystemVerilog除了數(shù)組、隊(duì)列和關(guān)聯(lián)數(shù)組等數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)還可以嵌套。
    的頭像 發(fā)表于 11-03 09:59 ?1465次閱讀

    數(shù)據(jù)結(jié)構(gòu)解決滑動(dòng)窗口問題

    前文用 [單調(diào)解決三道算法問題]介紹了單調(diào)這種特殊數(shù)據(jù)結(jié)構(gòu),本文寫一個(gè)類似的數(shù)據(jù)結(jié)構(gòu)「單調(diào)隊(duì)列」。 也許這種數(shù)據(jù)結(jié)構(gòu)的名字你沒聽過,其
    的頭像 發(fā)表于 04-19 10:50 ?564次閱讀
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>解決滑動(dòng)窗口問題

    Linux的進(jìn)程、線程、內(nèi)核以及中斷

    (push) 和 彈出 (pop) 操作。根據(jù)的特點(diǎn),很容易的想到可以利用數(shù)組,來實(shí)現(xiàn)這種數(shù)據(jù)結(jié)構(gòu)。但是本文要討論的并不是軟件層面的,而是硬件層面的
    的頭像 發(fā)表于 05-14 09:30 ?613次閱讀
    Linux<b class='flag-5'>中</b>的進(jìn)程<b class='flag-5'>棧</b>、線程<b class='flag-5'>棧</b>、內(nèi)核<b class='flag-5'>棧</b>以及中斷<b class='flag-5'>棧</b>