棧的鏈?zhǔn)酱鎯?chǔ)實(shí)現(xiàn)過程

1、定義棧的數(shù)據(jù)結(jié)構(gòu):

/* 節(jié)點(diǎn)結(jié)構(gòu)體*/
typedef struct Node {
    int value;             // 節(jié)點(diǎn)的值
    struct Node* next;     //  下一個(gè)節(jié)點(diǎn)的地址
} Node;
/* 棧結(jié)構(gòu)體*/
typedef struct {
    Node* top;             // 棧頂纬霞,指向首個(gè)節(jié)點(diǎn)的地址
} Stack;

2凌埂、初始化棧

void InitStack(Stack* stack){
    stack->top = (Node*)malloc(sizeof(Node));   // 為棧頂申請內(nèi)存
    stack->top->next = NULL;                    // 將棧頂?shù)闹赶虻南乱粋€(gè)節(jié)點(diǎn)置為空,防止出現(xiàn)野指針
}

3诗芜、入棧瞳抓,即向棧的頭部追加一個(gè)新的節(jié)點(diǎn)

void Push(Stack *stack,int value){
    Node* node;                            // 創(chuàng)建新節(jié)點(diǎn)
    node = (Node*)malloc(sizeof(Node));    // 為節(jié)點(diǎn)申請內(nèi)存
    node->value = value;                   // 為節(jié)點(diǎn)賦值
    node->next = stack->top->next;         // 將棧頂指向的節(jié)點(diǎn)放在新創(chuàng)的節(jié)點(diǎn)之后
    stack->top->next = node;               // 將棧頂指向新的節(jié)點(diǎn) 
}

4、出棧伏恐,即將隊(duì)尾的元素彈出

Node* Pop(Stack *stack){
    Node* del = NULL;                     // 創(chuàng)建一個(gè)空節(jié)點(diǎn)用來儲(chǔ)存首個(gè)節(jié)點(diǎn)
    del = stack->top->next;               // 將棧的首個(gè)節(jié)點(diǎn)賦值給剛剛創(chuàng)建的空節(jié)點(diǎn)
    if(del != NULL){                      // 判斷棧內(nèi)是否有節(jié)點(diǎn)
        stack->top->next = del->next;     // 將棧頂指向下一個(gè)節(jié)點(diǎn) 
    }
    return del;
}

5孩哑、 得到棧的長度

int Length(Stack *stack)
{
    int length = 0;
    Node *nNode;                // 創(chuàng)建新節(jié)點(diǎn)
    nNode = stack->top->next;   // 將棧頂指向節(jié)點(diǎn)賦值給新節(jié)點(diǎn)
    while (nNode != NULL)       // 判斷是否循環(huán)到隊(duì)尾
    {
        length++;
        nNode = nNode->next;    // 將指針指向下一個(gè)節(jié)點(diǎn)
    }
    return length;
}

5翠桦、顯示單個(gè)節(jié)點(diǎn)的值

void NodeDisPlay(Node* node){
    printf("This Node Value is %d.\n",node->value);
}

6横蜒、遍歷棧,每次將指針指向下個(gè)節(jié)點(diǎn)輸入節(jié)點(diǎn)的值销凑,通過指針是否為空判斷是否到達(dá)棧尾

void StackDisplay(Stack *stack){
    Node *nNode;                 // 創(chuàng)建新節(jié)點(diǎn)
    nNode = stack->top->next;    // 將棧頂指向節(jié)點(diǎn)賦值給新節(jié)點(diǎn)
    while (nNode != NULL)        // 判斷是否循環(huán)到隊(duì)尾
    {
        NodeDisPlay(nNode);      // 顯示當(dāng)前節(jié)點(diǎn)的值
        nNode = nNode->next;     // 將指針指向下一個(gè)節(jié)點(diǎn)
    }
}
  1. 清空棧
void CleanStack(Stack *stack){
    Node *pNode, *tmp;            // pNode節(jié)點(diǎn)用來存儲(chǔ)棧節(jié)點(diǎn)丛晌,tmp用來釋放內(nèi)存
    pNode = stack->top->next;     // 將棧頂指向節(jié)點(diǎn)賦值給pNode
    while(pNode != NULL){
        tmp = pNode;              // 記住需要釋放的內(nèi)存地址
        pNode = pNode->next;
        free(tmp);                // 釋放該地址的內(nèi)存
    }
}
  1. 銷毀整個(gè)棧
void Destory(Stack *stack){
    CleanStack(stack);      // 首先清空棧
    free(stack->top);       // 釋放棧
}
  1. 下面是完整的代碼
#include <stdio.h>
#include <stdlib.h>


typedef struct Node
{
    int value;         // 節(jié)點(diǎn)的值
    struct Node *next; //  下一個(gè)節(jié)點(diǎn)的地址
} Node;
typedef struct
{
    Node *top; // 棧頂,指向首個(gè)節(jié)點(diǎn)的地址
} Stack;
void InitStack(Stack *stack)
{
    stack->top = (Node *)malloc(sizeof(Node)); // 為棧頂申請內(nèi)存
    stack->top->next = NULL;                   // 將棧頂?shù)闹赶虻南乱粋€(gè)節(jié)點(diǎn)置為空斗幼,防止出現(xiàn)野指針
}
void Push(Stack *stack, int value)
{
    Node *node;                          // 創(chuàng)建新節(jié)點(diǎn)
    node = (Node *)malloc(sizeof(Node)); // 為節(jié)點(diǎn)申請內(nèi)存
    node->value = value;                 // 為節(jié)點(diǎn)賦值
    node->next = stack->top->next;       // 將棧頂指向的節(jié)點(diǎn)放在新創(chuàng)的節(jié)點(diǎn)之后
    stack->top->next = node;             // 將棧頂指向新的節(jié)點(diǎn)
}
Node *Pop(Stack *stack)
{
    Node *del = NULL;       // 創(chuàng)建一個(gè)空節(jié)點(diǎn)用來儲(chǔ)存首個(gè)節(jié)點(diǎn)
    del = stack->top->next; // 將棧的首個(gè)節(jié)點(diǎn)賦值給剛剛創(chuàng)建的空節(jié)點(diǎn)
    if (del != NULL)
    {                                 // 判斷棧內(nèi)是否有節(jié)點(diǎn)
        stack->top->next = del->next; // 將棧頂指向下一個(gè)節(jié)點(diǎn)
    }
    return del;
}
int Length(Stack *stack)
{
    int length = 0;
    Node *nNode;              // 創(chuàng)建新節(jié)點(diǎn)
    nNode = stack->top->next; // 將棧頂指向節(jié)點(diǎn)賦值給新節(jié)點(diǎn)
    while (nNode != NULL)     // 判斷是否循環(huán)到隊(duì)尾
    {
        length++;
        nNode = nNode->next; // 將指針指向下一個(gè)節(jié)點(diǎn)
    }
    return length;
}
void NodeDisPlay(Node *node)
{
    printf("This Node Value is %d.\n", node->value);
}
void StackDisplay(Stack *stack)
{
    Node *nNode;              // 創(chuàng)建新節(jié)點(diǎn)
    nNode = stack->top->next; // 將棧頂指向節(jié)點(diǎn)賦值給新節(jié)點(diǎn)
    while (nNode != NULL)     // 判斷是否循環(huán)到隊(duì)尾
    {
        NodeDisPlay(nNode);  // 顯示當(dāng)前節(jié)點(diǎn)的值
        nNode = nNode->next; // 將指針指向下一個(gè)節(jié)點(diǎn)
    }
}
void CleanStack(Stack *stack)
{
    Node *pNode, *tmp;        // pNode節(jié)點(diǎn)用來存儲(chǔ)棧節(jié)點(diǎn)澎蛛,tmp用來釋放內(nèi)存
    pNode = stack->top->next; // 將棧頂指向節(jié)點(diǎn)賦值給pNode
    while (pNode != NULL)
    {
        tmp = pNode; // 記住需要釋放的內(nèi)存地址
        pNode = pNode->next;
        free(tmp); // 釋放該地址的內(nèi)存
    }
}
void Destory(Stack *stack)
{
    CleanStack(stack); // 首先清空棧
    free(stack->top);  // 釋放棧
}

int main()
{
    Stack *stack;  
    InitStack(stack);
    Push(stack, 1);
    Push(stack, 2);
    Push(stack, 3);
    StackDisplay(stack);
    printf("This Stack's length is %d.\n",Length(stack));
    Node *newNode = Pop(stack);
    printf("This Stack's length is %d.\n", Length(stack));
    NodeDisPlay(newNode);
    StackDisplay(stack);
    Destory(stack);
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜕窿,隨后出現(xiàn)的幾起案子瓶竭,更是在濱河造成了極大的恐慌督勺,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斤贰,死亡現(xiàn)場離奇詭異智哀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)荧恍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門瓷叫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來送巡,“玉大人摹菠,你說我怎么就攤上這事骗爆。” “怎么了摘投?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵煮寡,是天一觀的道長。 經(jīng)常有香客問我犀呼,道長,這世上最難降的妖魔是什么外臂? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮宋光,結(jié)果婚禮上貌矿,老公的妹妹穿的比我還像新娘。我一直安慰自己罪佳,他們只是感情好站叼,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布尽楔。 她就那樣靜靜地躺著,像睡著了一般阔馋。 火紅的嫁衣襯著肌膚如雪娇掏。 梳的紋絲不亂的頭發(fā)上呕寝,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天婴梧,我揣著相機(jī)與錄音客蹋,去河邊找鬼孽江。 笑死,一個(gè)胖子當(dāng)著我的面吹牛岗屏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婉烟,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼暇屋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咐刨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仔粥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躯泰,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡华糖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诵竭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兼搏。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖佛呻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鲤嫡,我是刑警寧澤送挑,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布惕耕,位于F島的核電站,受9級特大地震影響赡突,放射性物質(zhì)發(fā)生泄漏区赵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一笼才、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昂羡,春花似錦摔踱、人聲如沸虐先。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腐芍。三九已至试躏,卻和暖如春猪勇,著一層夾襖步出監(jiān)牢的瞬間颠蕴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工项玛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弱判,地道東北人襟沮。 一個(gè)月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓开伏,卻偏偏與公主長得像膀跌,于是被迫代替她去往敵國和親固灵。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 本文內(nèi)容取自于小甲魚的數(shù)據(jù)結(jié)構(gòu)與算法丛忆。http://www.reibang.com/p/230e6fde9c75 ...
    阿阿阿阿毛閱讀 2,899評論 0 7
  • 在這篇文章里熄诡,我們來實(shí)現(xiàn)自定義的鏈?zhǔn)綏!J紫任覀儊砜纯存準(zhǔn)綏5慕Y(jié)構(gòu)及操作定義凰浮。 鏈?zhǔn)綏=Y(jié)構(gòu)定義 首先苇本,新建兩個(gè)文件...
    我叫卡卡算了閱讀 839評論 0 2
  • 1 序 2016年6月25日夜,帝都瓣窄,天下著大雨,拖著行李箱和同學(xué)在校門口照了最后一張合照俺夕,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,107評論 0 12
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx?那么一定聽過它的“同行”Apache吧登舞!Ngi...
    JokerW閱讀 32,700評論 24 1,002
  • 怕一不小心悬荣,就活成了你 怕心里再不承認(rèn)也沒用 小事一件件地提醒著我 居然你就這么變成了兩個(gè)迥然的鏡像 厭惡一個(gè)疙剑,卻...
    Cadendeng閱讀 167評論 0 0