3 棧和隊列-棧的定義(待更改)

//An是棧頂,A1端是棧底
//基本操作
InitStack(&S)
//操作結果:構造一個空棧S。
DestroyStack(&S)
//初始條件:棧S已經存在
//操作結果:棧S被銷燬
ClearStack(&S)
//初始條件:棧S已經存在
//操作結果:棧S清空爲出棧
StackEmpty(S)
//初始條件:棧S已經存在
//操作結果:若棧S爲空棧,則返回TRUE,否則返回FALSE
StackLength(S)
//初始條件:棧S已經存在
//操作結果:返回S的元素的個數,即棧的長度
GetTop(S,&e);
//初始條件:棧S已存在
//操作結果:用e返回棧頂元素。
Push(&S,e)
//初始條件:棧S已存在
//操作結果:插入元素e爲新的棧頂元素
Pop(&S,&e)
//初始條件:棧S已存在
//操作結果:刪除S的棧頂元素,同時並用e返回其值
StackTraverse(S,visit())
//初始條件:棧S已存在且非空
//操作結果:從棧底到棧頂依次對S的每個數據元素調用函數visit()
//一旦調用的失敗,則操作失敗

和線性表類似,棧的存儲方法,分爲兩種
(1)順序棧:棧的順序存儲結構是利用一組地址連續的存儲單元依次
存放自棧底到棧頂的數據元素,
同時附設指針top指示棧頂元素在順序棧中的位置。
【習慣做法】top=0表示空棧,一般在初始化設空棧時不應限定棧的最大容量
【合理做法】先爲棧分配一個基本容量,當棧的空間不夠時在逐漸擴大
設定兩個常量:1_STACK_INIT_SIZE(存儲空間初始分配量)
2_STACKINCREMENT(存儲空間分配增量)

//順序棧的定義
typedef struct{
    SElemType *base;
    SElemType *top;
    int stacksize; //當前可使用的最大容量
}SqStack;

棧的初始化操作爲:按設定的初始分配量進行第一次存儲分配
base爲棧底指針,在順序棧中,他始終指向棧底的位置,
若base的值爲NULL,則表明棧結構不存在
top爲棧頂指針,其初值指向棧底,若top=base,則棧空。
每當插入新的棧頂元素時,指針top增1。
刪除棧頂元素時,指針top減1
非空棧的棧頂指針始終在棧頂元素的下一個位置上

//----------ADT Stack的表示與實現---------
//----------棧的順序存儲表示--------------
#define STACK_INIT_SIZE 100;//存儲空間初始分配量
#define STACKINCREMENT 100;//存儲空間初始分配量
typedef struct
{
    SElemType *base;//構造之前和銷燬之後,base的值爲NULL
    SElemType *top; //棧頂指針 base和top都是指針變量
    int stacksize; //當前已經分配的存儲空間,以元素爲單位
}SqStack;
//--------------基本操作和函數原型-------------
Status InitStack(SqStack &S) //構造一個空棧S。
Status DestroyStack(SqStack &S)//銷燬棧S,S不在存在
Status ClearStack(SqStack &S) //把S置爲空棧
Status StackEmpty(SqStack S); //若棧S爲空棧,則返回TRUE,否則返回FALSE
int StackLength(SqStack);//返回S的元素的個數,即棧的長度
Status GetTop(SqStack S,SElemType &e); 
//若棧不空,則用e返回S棧頂元素,並返回OK 否則返回FALSE
Status Push(SqStack &S,SElemType e);
//操作結果:插入元素e爲新的棧頂元素
Status Pop(SqStack &S,SElemType &e);
//操作結果:刪除S的棧頂元素,同時並用e返回其值
StackTraverse(SqStack S,Status(*visit)())
//操作結果:從棧底到棧頂依次對S的每個數據元素調用函數visit()
//一旦調用的失敗,則操作失敗
//---------基本操作和算法描述-------------
Status InitStack(SqStack &S) //構造一個空棧S。
{
    //構造一個空棧S。
    S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!Sbase)exit(OVERFLPW);//存儲分配失敗
    S.top = S.base;
    S.stacksize = STACKINCREMENT;
    return OK;
}//InitStack

Status GetTop(SqStack S,SElemType &e)
//若棧不空,則用e返回S的棧頂元素,並返回OK,否則返回ERROR
{
    if(S.top==S.base) return ERROR;
    e = *(S.top-1);
    return OK;
}//GetTop
Status Push(SqStack &S,SElemType e)
    //插入元素e爲新的棧頂元素
{
    if(S.top-S.base>=S.stacksize)//棧滿追加空間
    {
        S.base = (SElemType*)relloc(S.base,
        (S.stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!S.base)exit(OVERFLOW);//存儲分配失敗
        S.top = S.base+S.stacksize;
        S.stacksize +=STACKINCREMENT;
    }
    *S.top++=e;//先移動位置,在賦值
    return OK;  
}
Status Pop(SqStack &S,SElemType &e)
{
    //若棧不空,則刪除S的棧頂元素,用e返回其值,並返回OK,否則返回ERROR
    if(S.top==S.base) return ERROR;
    e = *--S.top;
    return OK;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章