標籤:
棧是限定僅在表尾進行插入或者刪除操作的線性表。各位也可以到360雲端硬碟中下載完整程式,運行環境為vc++6.0
http://yunpan.cn/cVKkv9fmsp4wB 訪問密碼 b737
1 typedef struct2 {3 SelemType *base;4 SelemType *top;5 int stacksize;6 }SqStack;
現在來介紹下棧的操作實現。
/********************************************************************函數名稱: InitStack函數作用: 構造一個空棧輸入參數: s輸出參數: 無傳回值: FALSE or TRUE********************************************************************/Status InitStack(SqStack &s){ s.base=(SelemType *)malloc(STACK_INIT_SIZE*sizeof(SelemType)); //申請空間 if(!s.base) return FALSE; //如果申請不成功,返回FALSE s.top=s.base; //申請成功,令棧頂指標等於棧尾指標 s.stacksize=STACK_INIT_SIZE; //stacksize表示申請分配的空間大小 return TRUE;}
/********************************************************************函數名稱: Push函數作用: 將元素e入棧 輸入參數: 棧s,元素e輸出參數: 無傳回值: FALSE or TRUE時間複雜度:O(1)********************************************************************/Status Push(SqStack &s,SelemType e){ if((s.top-s.base)>=s.stacksize) { s.base=(SelemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SelemType)); if(!s.base) return FALSE; s.top=s.base+s.stacksize; s.stacksize+=STACKINCREMENT; } *s.top++=e; return TRUE;}
/********************************************************************函數名稱: StackBrower函數作用: 遍曆輸入參數: 棧s輸出參數: 無傳回值: FALSE or TRUE時間複雜度:O(n)********************************************************************/Status StackBrower(SqStack s){ if(!s.base) { cout<<"不存在棧s"<<endl; return FALSE; } if(s.top==s.base) { cout<<"s為空白棧"<<endl; return FALSE; } while(!(s.top==s.base)) { cout<<*(--s.top)<<" "; } cout<<endl; return TRUE;}
/********************************************************************函數名稱: DestroyStack函數作用: 銷毀空棧輸入參數: 棧s輸出參數: 無傳回值: FALSE or TRUE時間複雜度:O(1)********************************************************************/Status DestroyStack(SqStack &s){ free(s.base); //只需要釋放base指標 s.base=NULL; return TRUE;}
/********************************************************************函數名稱: ClearStack函數作用: 銷毀空棧輸入參數: 棧s輸出參數: 無傳回值: FALSE or TRUE時間複雜度:O(1)********************************************************************/Status ClearStack(SqStack &s){ if(s.top==s.base) return TRUE; s.top=s.base; return TRUE; }
/********************************************************************函數名稱: StackEmpty函數作用: 判斷是否為空白棧輸入參數: 棧s輸出參數: 無傳回值: 0非空棧 or 1空棧時間複雜度:O(1)********************************************************************/Status StackEmpty(SqStack &s){ return(s.base==s.top);}
/********************************************************************函數名稱: StackLength函數作用: 擷取當前儲存資料的長度輸入參數: 棧s輸出參數: 無傳回值: 棧長時間複雜度:O(1)********************************************************************/int StackLength(SqStack s){ return (s.top-s.base);}Status GetTop(SqStack s,SelemType &e){ e=*(s.top-1); return TRUE;}
接下來就是main函數測試代碼
#include"StackLib.h"void main(){ int e[20]; int i=0; int a; for(i=0;i<20;i++) e[i]=i; SqStack s; InitStack(s); //構造一個空棧 for(i=0;i<20;i++) { Push(s,e[i]); //資料入棧 } StackBrower(s); //遍曆堆棧 cout<<"當前儲存資料:"<<StackLength(s)<<"個"<<endl; GetTop(s,a); //獲得棧頂元素,並列印 cout<<a<<endl; ClearStack(s); //清空棧 StackBrower(s); //遍曆棧 cout<<"1為空白棧,0非空:"<<StackEmpty(s)<<endl; //判斷棧是否為空白 DestroyStack(s); //銷毀堆棧 StackBrower(s); //}
c語言資料結構之棧的基本操作