棧的基本操作(+例項)
阿新 • • 發佈:2018-11-08
棧:是限定僅在表尾進行插入或刪除操作的線性表,表尾段稱為棧頂,表頭段稱為棧底,棧有稱後進先出線性表。棧有順序棧和鏈棧。
1、順序棧的結構定義
//順序棧的儲存結構 typedef struct{ ElemType *base;//棧底指標變數 ElemType *top;//棧頂指標變數 int stackSize;//當前可使用的最大容量 }sqStack;
2、建立一個空棧
//建立一個空棧 #define STACK_INIT_SIZE 100 //儲存空間初始分配量 #define STACKINCREMENT 10 //儲存空間分配增量 Status InitStack(SqStack&s){ s.base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if( !s.base ) exit(OVERFLOW); s.top = s.base; s.stackSize = STACK_INIT_SIZE; return OK; }
3、元素入棧
//元素入棧 Status Push(SqStack &s, ElemType e){ if( s.top-s.base >= s.stackSize ){//若棧滿則追加空間s.base = (ElemType *)realloc(s.base,(s.stackSize+STACKINCREAMENT)*sizeof(ElemType)); if( !s.base ) exit(OVERFLOW); s.top = s.base+s.stackSize; //設定棧頂 s.stackSize = s.stackSize+STACKINCERMENT; //設定棧的最大容量 } *s.top = e; s.top++; //*s.top++ = e; }
4、元素出棧
//元素出棧 Status Pop(SqStack &s, ElemType &e){ //若棧不為空,則用e返回s的棧頂元素 if( s.top == s.base ) return ERROR; e = *--s.top; //s.top指標先向下移動一個位置,再取出其中的元素 return OK; }
5、清空一個棧(將棧頂指標指向棧底指標)
//清空一個棧 Status ClearStack(SqStack &s){ s.top = s.base; //棧頂指標指向棧底指標 return OK; }
6、銷燬一個棧
//銷燬棧 Status DestroyStack(SqStack &s){ int len = s.stackSize; for(int i =0; i < len; i++){ free(s.base); s.base++; } s.base = s.top = NULL; s,stackSize = 0; }
7、返回棧的當前容量
//返回棧當前容量 Status StackLen(SqStack &s){ return (s.yop-s.base); }
棧的應用(進位制間的轉換):