棧是限定僅在表尾進行插入或者刪除操作的線性表。各位也可以到360雲盤中下載完整程序,運行環境為vc++6.0
http://yunpan.cn/cVKkv9fmsp4wB 訪問密碼 b737
1 typedef struct
2 {
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); //
}