資料結構:順序棧的實現
1、快速開始
棧是一種遵循元素後進(push)先出(pop)規則的線性表,即最後加入的元素最先出來,它的實現可以用陣列或者鍊錶。
它的特點如下:
**先出,先入後出。
除了頭尾節點之外,每乙個元素有乙個前驅,有乙個後繼。
2、實現棧
我們已經說過了,棧是一種線性表,故其底層是基於陣列或者鍊錶的。那麼,我們的重點是維護一種規則,即後進先出。
我們始終要有乙個變數l來記錄最後乙個元素的位置:
當壓入時,將新元素插入到l位置之後,然後更新l,即l+1.
當彈出時,將l位置元素進行刪除,然後更新l,即l-1。
也正是因為,我們使用的是線性表,正好可以利用其尺寸來表示l,即線性表的大小可以表示最後乙個元素的位置。
2.1、棧的實現
class mystack sqstack;
說明:1.base表示棧底指標,在判斷出棧、初始化和重新分配空間的時候需要用到。
2.top表示棧頂指標,是棧最關鍵和核心的組成,入棧時top向上移動,出棧時top向下移動。
3.此處的stacksize並不表示當前的棧中的元素數量,而是表示棧的容量,也就是能裝多少個元素。
3.2、初始化棧:
int initstack(sqsatck *s)
s->base=(int*)malloc(100*sizeof(int));
if(!s)
return 0; //0代表操作失敗
s->top=s->base;
stacksize=100;
return 1; //1代表操作完成
說明:1.順序棧初始化無非就是給棧分配連續的記憶體空間,base是棧底指標,在上面提到過,它用來指示一段連續的記憶體空間的首位址,也就是用來初始化。
2.分配空間不意味著一定會有那麼多空間,所以判斷也不可缺少。
3.分配空間後,base和top的位址應該一致,此時top還沒有移動。
3.3、壓棧
int push(sqstack * s,int elem)
if(s->top-s->base>=s->stacksize)
s->base=(selemtype *)
realloc(s->base,(s->stacksize+10)*sizeof(selemtype)); //10代表增量,你可以使用巨集定義,方便後續修改。
if(!s->base)
return 0;
s->top=s->base+s->stacksize;
s->stacksize+=10
*s->top++=elem;
return 1;
說明:1.壓棧是棧的核心操作,關鍵步驟無非是*s->top++=elem;但是在進行此步操作時,一定要判斷棧是否超出容量。
2.如果棧超出容量,則要在進行原空間的基礎上重新分配空間,realloc是關鍵的命令。
realloc
原型:extern void *realloc(void *mem_address, unsigned int newsize);
用法:#include 有些編譯器需要#include
功能:改變mem_address所指記憶體區域的大小為newsize長度。
說明:如果重新分配成功則返回指向被分配記憶體的指標,否則返回空指標null。
當記憶體不再使用時,應使用free()函式將記憶體塊釋放。
3.分配空間以後,在修改stacksize之前,top應該保持在容量頂端,s->top=s->base+s->stacksize;
2.4出棧
int pop(sqstack *q)
if(s->top==s->base)
return 0;
return *s->--top;;
說明:1.出棧是簡單操作,其實這裡並沒有完美的實現這個效果,你應該考慮到如果在擴容後又迅速減小,會造成大量的空間浪費。
2.5遍歷棧
int printfstack(sqstack *s)
int *p=s->base;
puts("輸出棧");
for(p;p!=s->top;p++)
printf("***%d",*p);
資料結構 順序棧
編寫乙個程式,實現順序棧 假設棧中元素型別為char 的各種基本運算。並完成下面功能 1 初始化棧s 2 判斷棧s是否非空 3 依次進棧元素a,b,c,d,e 4 判斷棧s是否非空 5 輸出棧長度 6 輸出從棧頂到棧底元素 7 輸出出棧序列 8 判斷棧s是否非空 9 釋放棧。include incl...
資料結構 順序棧
構造乙個順序棧 當輸入9999時,結束入棧操作 輸出棧中元素,顯示棧頂元素,刪除棧頂元素 include include include define stack init size 100 define ok 1 define error 0 typedef int selemtype 順序棧結構...
資料結構 順序棧
棧是一種只能在一端進行插入或刪除操作的線性表。其中允許進行插入或刪除操作的一端稱為棧頂 top 棧頂是由乙個稱為棧頂指標的位置指示器來指示,它是動態變化的。表的另一端稱為棧底,棧底是固定不變的。先進後出 filo include include define maxsize 100 typedef ...