棧的鏈式儲存結構及實現

2021-08-14 02:00:07 字數 2801 閱讀 8668

今天學習棧的鏈式儲存結構。

鏈式儲存結構最大的好處就是沒有空間的限制,通過指標指向將結點像乙個鍊子一樣把結點鏈結,那麼棧的同樣可以用於鏈式儲存結構。

棧的鏈式儲存結構,簡稱為鏈棧。想想看,棧只是棧頂來做插入和刪除操作,棧頂放在鍊錶的頭部還是尾部呢?由於單鏈表有頭指標,而棧頂指標也是必須的,那麼幹嘛不讓他們合二為一呢,所以比較好的辦法是把棧頂放到單鏈表的頭部。另外棧頂在頭部了,那麼單鏈表的頭結點也就失去了意義,通常對於鏈棧來說,是不需要頭結點的。

同樣對於鏈棧來說,基本不存在棧滿的情況,除非記憶體已經沒有可用的空間了。

下面是鏈棧的指向圖:

同樣鏈棧中最重要的演算法是壓棧和彈棧。

壓棧操作:

操作很簡單,新建結點,給結點資料域賦值,指標域指向原來棧頂元素。

然後將棧頂指標指向新結點,元素個數+1,就ok。如下圖:

彈棧操作:

和壓棧相反,將棧頂元素的資料域取通過指標返回這個資料,將要彈出的元素的指標域賦值給棧頂指標,然後釋放這個元素,這樣棧頂指標就指向新的棧頂了,然後元素個-1。如圖:

下面我們來看一下相關**的實現。

#define _crt_secure_no_warnings

#include #include #include #include #define error 0

#define ok 1

#define true 1

#define false 0

typedef int status;

typedef int eletype;

typedef struct stacknode stacknode,* linkstackpoi;

//鏈棧的資料結構

typedef struct linkstack linkstack;

//初始化

status initlinkstack(linkstack* stack)

stack->top = null;

stack->count = 0;

return ok;

}//清空資料,釋放結點記憶體,實際上就是pop所有資料

status clearlinkstack(linkstack* stack)

while (stack->count)

return ok;

}//判斷鏈棧是否為空

status emptylinkstack(linkstack* stack)

return stack->count == 0 ? 1 : 0;

}//獲取元素個數

int getlengthlinkstack(linkstack* stack)

return stack->count;

}status gettop(linkstack* stack, stacknode** stacknode)

*stacknode = stack->top;//將棧頂元素的指標返回,獲取指向可修改棧頂元素內容。

return ok;

}//status gettop(linkstack* stack, stacknode* stacknode)

//// *stacknode = *(stack->top);//將棧頂元素的副本內容,修改不會影響到棧頂元素。

// return ok;

//}/*

彈棧棧頂指標指向要彈出元素前置結點,然後釋放彈出元素記憶體空間,然後count-1

*/status pop(linkstack* stack,eletype *e)

stacknode* node = stack->top;

*e = node->data;

stack->top = node->next;//棧頂指標指向新的棧頂元素

free(node);//釋放元素空間

stack->count--;

return ok;}/*

壓棧先將壓入元素放入到煉表表中,然後再將棧頂指標指向壓入的元素,然後count+1.

*/status push(linkstack* stack,eletype e)

stacknode* node = (stacknode*)malloc(sizeof(stacknode));

node->next = stack->top;//將元素加入鍊錶中

node->data = e;

stack->top = node;//棧頂元素指向壓入元素

stack->count++;

return ok;

}void printflinkstack(linkstack* stack)

stacknode* node = stack->top;

while (node)

puts("");

return;

}int main(int argc, char *argv)

驗證結果:

學習演算法,我們首先要去領悟它的這種思想,以後在遇到問題時才會有思路。

棧的鏈式儲存結構及實現

棧的鏈式儲存結構,簡稱為鏈棧,如圖所示 對於鏈棧來說,基本不存在棧滿的情況,除非記憶體以沒有儲存空間。鏈棧的結構 如下 typedef struct stacknode stacknode,linkstackptr typedef struct linkstack linkstack 鏈棧的操作和普...

4 1 1 棧的鏈式儲存結構及實現

棧的鏈式儲存結構,簡稱為鏈棧。由於單鏈表有頭指標,而棧頂指標也是必須的,所以把棧頂放在單鏈表的頭部。另外,因為有了棧頂在頭部了,所以單鏈表中比較常用的頭結點也就失去了意義,通常對於鍊錶來說,是不需要頭結點的。鏈棧的結構 typedef struct stacknode stacknode,links...

棧的順序儲存實現及鏈式儲存實現

include include define size 100 typedef int elemtype typedef struct stackstack void init stack s 初始化 intpush stack s,elemtype e 入棧 s s s top e 從s 1 開始...