【數(shù)據(jù)結構】棧和隊列之棧各種操作

棧的定義

棧實際上也是線性表暇检,只不過是一種特殊的線性表。其特殊性在于棧的基本操作是線性表操作的子集婉称,他們的操作受限于線性表块仆,可稱為限定性的數(shù)據(jù)結構。

棧(stack)是限定僅在表尾進行插入和刪除操作的線性表王暗,它是一種后進先出(Last in First out ,LIFO)的線性表

棧的特性
  • 允許插入和刪除的一段稱為棧頂(top)悔据,另外一段稱為棧底(bottom)
  • 不含任何數(shù)據(jù)元素的棧稱為空棧俗壹。
  • 棧的元素必須后進先出科汗。
棧的操作
  • 插入操作
    棧的插入操作(Push),叫做進棧绷雏,也稱壓棧头滔、入棧
    進棧
  • 刪除操作
    棧的刪除操作(Pop)涎显,叫做出棧坤检,也稱彈棧
    出棧

棧的順序存儲結構及實現(xiàn)

棧的本質是一個線性表期吓,線性表有兩種存儲形式早歇,棧也分為棧的順序存儲結構和棧的鏈式存儲結構

在操作棧的時候,棧會有三種情況:棧普通情況讨勤、空棧箭跳、棧滿

棧的三種情況

定義一個順序順序存儲結構
#include <stdio.h>
#include <stdlib.h>
#define OK 1;
#define ERROR 0;
#define TRUE 1;
#define FALSE 0;
#define STACK_INIT_SIZE 100  /* 初始化椞肚В空間為 100 */
#define STACKINCREMENT 10

typedef int Status; /*Status是函數(shù)的類型谱姓,其值是函數(shù)結果狀態(tài)碼,如OK等*/
typedef int  ElemType;

typedef struct {
    
    ElemType * base;    /* 指向棧底的指針變量 */
    ElemType * top;     /* 指向棧頂?shù)闹羔樧兞?*/
    int stackSize;      /* 棧的當前可使用的最大容量 */
    
}sqStack;

也可以這樣聲明

typedef struct {
    
    ElemType data[MAXSIZE];
    int top;            /* 用于標注棧頂?shù)奈恢?*/
    int stackSize;      /* 棧的當前可使用的最大容量 */
}sqStack;

創(chuàng)建一個順序順序存儲結構的棧
#define STACK_INIT_SIZE 100  /* 初始化椗偾纾空間為 100 */
/**
 * 創(chuàng)建棧
 */
void initStack(sqStack *s){
    
    s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    if (!s->base) exit(0);
    
    s->top = s->base;   /* 最開始逝段,棧頂就是棧底 */
    s->stackSize = STACK_INIT_SIZE;
}
一、入棧操作

/**
 * 入棧操作
 */
Status Push(sqStack * s, ElemType e){
    
    if (s->top - s->base >= s->stackSize) {  //棧滿 割捅,追加空間
        
        s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
        
        if (!s->base) exit(0);
        
        s->top = s->base + s->stackSize;  // 設置棧頂
        s->stackSize = s->stackSize + STACKINCREMENT;  // 設置棧的最大容量
    }
    
    *(s->top) = e;  // 元素e入棧,賦值到棧頂空間
    s->top++;       // 棧頂指針增加1

    return OK;
}
二帚桩、出棧操作
/**
 * 出棧操作(刪除棧S的棧頂元素亿驾,用e返回其值)
 */
Status Pop(sqStack * s, ElemType *e){
    
    if (s->top == s->base) // 棧空
        return ERROR;
    
    s->top--;        // 棧頂指針減1
    *e = *(s->top);  // 將要刪除的棧頂元素賦值給e
//    *e = *--(s->top);
    return OK;
}
三账嚎、清空棧

清空一個棧莫瞬,就是將棧中的元素全部作廢儡蔓,但是棧本身物理空間并不發(fā)生變化。這里的方式定義的棧疼邀,只需要將s->top = s->base;即可實現(xiàn)棧的清空喂江。

/**
 * 清空一個棧(將棧中的元素全部作廢,棧本身的物理空間并不發(fā)生變化)
 */
Status ClearStack(sqStack *s){
    s->top = s->base;
    return OK;
}
四旁振、銷毀棧

銷毀一個棧和釋放一個棧不同获询,銷毀一個棧是要釋放該棧所占據(jù)的物理內存空間

/**
 * 銷毀棧(釋放該棧鎖占據(jù)的物理內存空間)
 */
Status DestoryStack(sqStack * s){
    
    int i,len;
    len = s->stackSize;   // 獲取棧容量
    
    for (i = 0; i < len; i++) {
        free(s->base);
        s->base++;
    }
    
    s->base = s->top = NULL;
    s->stackSize = 0;
    
    return OK;
}
五拐袜、計算棧的當前容量

計算棧的當前容量也就是計算棧中元素的個數(shù)吉嚣,在這里只需要返回即可

/**
 * 計算棧的當前容量
 */
int StackLen(sqStack s){
    
    return (s.top - s.base);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹬铺,隨后出現(xiàn)的幾起案子尝哆,更是在濱河造成了極大的恐慌,老刑警劉巖甜攀,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秋泄,死亡現(xiàn)場離奇詭異,居然都是意外死亡规阀,警方通過查閱死者的電腦和手機恒序,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姥敛,“玉大人奸焙,你說我怎么就攤上這事⊥玻” “怎么了与帆?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長墨榄。 經常有香客問我玄糟,道長,這世上最難降的妖魔是什么袄秩? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任阵翎,我火速辦了婚禮,結果婚禮上之剧,老公的妹妹穿的比我還像新娘郭卫。我一直安慰自己,他們只是感情好背稼,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布贰军。 她就那樣靜靜地躺著,像睡著了一般蟹肘。 火紅的嫁衣襯著肌膚如雪词疼。 梳的紋絲不亂的頭發(fā)上俯树,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音贰盗,去河邊找鬼许饿。 笑死,一個胖子當著我的面吹牛舵盈,可吹牛的內容都是我干的陋率。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼书释,長吁一口氣:“原來是場噩夢啊……” “哼翘贮!你這毒婦竟也來了?” 一聲冷哼從身側響起爆惧,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤狸页,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扯再,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芍耘,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年熄阻,在試婚紗的時候發(fā)現(xiàn)自己被綠了斋竞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡秃殉,死狀恐怖坝初,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情钾军,我是刑警寧澤鳄袍,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站吏恭,受9級特大地震影響拗小,放射性物質發(fā)生泄漏。R本人自食惡果不足惜樱哼,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一哀九、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搅幅,春花似錦阅束、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春界牡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漾抬。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工宿亡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纳令。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓挽荠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親平绩。 傳聞我的和親對象是個殘疾皇子圈匆,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容