堆棧是操做受限的線性表,只能在同一端插入與刪除元素。
容許進行插入刪除操做的一段稱爲棧頂,所以棧頂是動態變化的。另外一端被稱爲棧底。數組
根據存儲結構不一樣分爲:順序棧 與 鏈棧。函數
順序棧是在物理內存的連續空間內存放從棧底到棧頂的全部數據元素,同時還附帶一個top指針指向棧頂在順序棧中的位置(top可表明數組下標)。設計
鏈棧在物理內存上是零散的不連續的空間,節點之間經過地址域相互保存。棧頂指針top就是編標的表頭指針。(與單鏈表相似)
3d
棧的基本操做爲入棧出棧:指針
#include "stdio.h" #define StackSize 50 #define StackElementType int typedef struct { StackElementType elem[StackSize]; int top; }SeqStack; void InitStack(SeqStack *S) { S->top = -1;} int Push(SeqStack *S,StackElementType x) { if(S->top==(StackSize-1)) return(0); //棧已滿 S->top++; S->elem[S->top]=x; return(1); } int Pop(SeqStack *S,StackElementType *x) { // 將棧S的棧頂元素彈出,放到x所指的存儲空間中 if(S->top==-1) return(0);//棧爲空 else { *x=S->elem[S->top]; S->top--; // 修改棧頂指針 return(1); } } int GetTop(SeqStack *S, StackElementType *x) { // 讀出棧頂元素賦值給x所指空間,但棧頂指針保持不變 if(S->top==-1) return(0); //棧爲空 else { *x = S->elem[S->top]; //top不變 return(1); } } int IsEmpty(SeqStack *S) //也可SeqStack S { return(S->top==-1?1:0); } void main() { SeqStack T;int i,x; InitStack(&T); printf("輸入入棧的數據(整數型,0結束):"); scanf("%d",&x); while(x!=0){ Push(&T,x) ; printf("輸入入棧的數據(整數型,0結束):"); scanf("%d",&x); } Pop(&T,&x); printf("出棧的數據爲:%d\n",x); Pop(&T,&x); printf("出棧的數據爲:%d\n",x); }
堆棧能夠在程序設計語言中實現遞歸調用。即函數直接或間接的調用自身。
爲保證遞給調用正確執行,系統設置「遞歸工做棧」做爲遞歸調用的數據存儲區。
每一層地櫃包含 參數、局部變量、全局變量、上層返回的地址。每進入一層,產生新的工做記錄壓入棧頂,每退出一層就從棧頂彈出一個工做記錄。
以n的階乘爲例:code
// 階乘的遞歸運算 int f(int n) { if (n==0) { return 1; } else { return n*f(n-1); } }