今天學習棧的鏈式儲存結構。
鏈式儲存結構最大的好處就是沒有空間的限制,通過指標指向將結點像乙個鍊子一樣把結點鏈結,那麼棧的同樣可以用於鏈式儲存結構。
棧的鏈式儲存結構,簡稱為鏈棧。想想看,棧只是棧頂來做插入和刪除操作,棧頂放在鍊錶的頭部還是尾部呢?由於單鏈表有頭指標,而棧頂指標也是必須的,那麼幹嘛不讓他們合二為一呢,所以比較好的辦法是把棧頂放到單鏈表的頭部。另外棧頂在頭部了,那麼單鏈表的頭結點也就失去了意義,通常對於鏈棧來說,是不需要頭結點的。
同樣對於鏈棧來說,基本不存在棧滿的情況,除非記憶體已經沒有可用的空間了。
下面是鏈棧的指向圖:
同樣鏈棧中最重要的演算法是壓棧和彈棧。
壓棧操作:
操作很簡單,新建結點,給結點資料域賦值,指標域指向原來棧頂元素。
然後將棧頂指標指向新結點,元素個數+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 開始...