【数据结构基础笔记】【栈】
代碼參考《妙趣橫生的算法.C語言實(shí)現(xiàn)》
文章目錄
- 前言
- 1、棧的定義
- 2、創(chuàng)建一個棧
- 3、入棧和出棧操作
- 4、棧的清空、銷毀、計算棧的當(dāng)前容量
- 5、實(shí)例分析
前言
本章總結(jié):棧的定義、創(chuàng)建棧,銷毀棧,入棧出棧操作等操作。
1、棧的定義
棧是一種重要的線性結(jié)構(gòu)。是鏈表和順序表的具體形式。
stack是一個后進(jìn)先出的線性表。棧的操作只能限定在這個順序表的表尾進(jìn)行,我們稱這個地方為棧頂(top),相應(yīng)的表頭稱為棧底(bottom)
最開始棧中不含有任何數(shù)據(jù),叫做空棧,此時棧頂就是棧底。數(shù)據(jù)從棧頂進(jìn)入,棧頂棧底分離,棧的容量變大。數(shù)據(jù)出棧時從棧頂彈出,棧頂下移,整個棧的當(dāng)前容量變小。
用順序表建立棧:
typedef struct {ElemType *base; //指向棧底的指針ElemType *top; //指向棧頂?shù)闹羔?/span>int stacksize; //當(dāng)前可使用的最大容量 }sqStack;2、創(chuàng)建一個棧
1、在內(nèi)存中開辟一段連續(xù)的空間,用作棧的物理存儲空間;
2、將棧頂、棧底的地址賦值給top和base,并設(shè)置stacksize,以便通過這個變量對棧進(jìn)行各種操作
3、入棧和出棧操作
入棧:每向棧中壓入一個數(shù)據(jù),top指針+1,直到棧滿為止
//入棧 #define STACKINCREMENT 10 void PushStack(sqStack* s,ElemType elem) {if (s->top - s->base >= s->stacksize) //判斷棧是否滿了{//如果棧滿了,追加空間s->base = (ElemType*)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(ElemType));if (!s->base) //內(nèi)存分配失敗{printf("內(nèi)存分配失敗");exit(0);}s->top = s->base + s->stacksize;s->stacksize = s->stacksize + STACKINCREMENT; //重置棧的最大容量}*(s->top) = elem; //放入數(shù)據(jù)s->top++; //top指針+1 }出棧操作就是棧頂(指針先下移指向棧頂元素)取出元素,棧頂指針隨之下移的操作。可以重復(fù)出棧,直道該棧變?yōu)榭諚橹?/p> //出棧操作 void PopStack(sqStack* s, ElemType *elem) {if (s->top == s->base) return; //棧空了,程序返回s->top--; //top指針-1*elem = *(s->top); //將棧頂元素取出,給elem }
4、棧的清空、銷毀、計算棧的當(dāng)前容量
1、清空一個棧就是希望棧中的元素全部作廢,而棧本身的物理空間不一定發(fā)生變化。
因此只需要將s->top的內(nèi)容賦值為s->base即可
2、銷毀一個棧是要釋放掉該棧所占據(jù)的物理內(nèi)存空間,因此銷毀與清空棧是兩個不同的操作。
5、實(shí)例分析
利用棧的數(shù)據(jù)結(jié)構(gòu),將二進(jìn)制轉(zhuǎn)換為十進(jìn)制:
已知公式為:
思路:將一串二進(jìn)制的0/1碼,從高位到低位順序入棧,再逐一從棧頂取出元素,取出的第i個元素乘上2的i-1次方,并逐一累加,最終得到十進(jìn)制表達(dá)。
reslut:
總結(jié)
以上是生活随笔為你收集整理的【数据结构基础笔记】【栈】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。