1. 程式人生 > >一個菜鳥的資料結構學習之路(棧篇)

一個菜鳥的資料結構學習之路(棧篇)

棧的基本操作如下:

  • 相關結構體:
typedef int status;

typedef struct
{
    SElemType *base; //在棧建立之前和銷燬之後,base的值為NULL
    SElemType *top; //棧頂指標
    int stacksize; //當前已分配的儲存空間,以元素為單位
}SqStack;
  • 相關巨集定義:
# define STACK_INIT_SIZE 100
# define STACKINCREMENT 10
# define OK 1
# define ERROR
  • 相關函式宣告:
Status InitStack(SqStack &S)
; /*構造一個空棧S*/ Status DestoryStack(SqStack &S); /*銷燬棧S,S不再存在*/ Status ClearStack(SqStack &S); /*把棧S置為空棧*/ Status StackLength(SqStack S); /*返回棧S的元素個數,即棧長*/ Status GetTop(SqStack S,SElemType &e);/*若棧不為空,則用e返回S的棧頂元素,成功則返回OK,否則返回ERROR*/ Status Push(SqStack &S,SElemType &e); /*在棧S的棧頂插入元素e為新的棧頂元素*/
Status Pop(SqStack &S,SElemType &e); /*若棧不為空,則刪除棧頂元素,用e返回此值,成功則返回OK,否則返回ERROR*/
  • 構造空棧S:
Status InitStack(SqStack &S); /*構造一個空棧S*/
{
    S.base = (SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE); //分配記憶體
    if(!S.base)
        exit(ERRORFLOW);
    S.top = S.base; //將base置於棧頂
    S.stacksize = STACKINCREMENT; //定義棧S的長度
return OK; }
  • 銷燬棧S:
Status DestoryStack(SqStack &S); /*銷燬棧S,S不再存在*/
{
    S.top = S.base = NULL;
    return OK;
}
  • 把棧S置空:
Status ClearStack(SqStack &S); /*把棧S置為空棧*/
{
    S.top = S.base; //棧頂為空
    stacksize = 0; //已分配空間置0
}
  • 棧長:
Status StackLength(SqStack S); /*返回棧S的元素個數,即棧長*/
{
    return stacksize;
}
  • 用e返回棧頂元素:
Status Push(SqStack &S,SElemType &e); /*在棧S的棧頂插入元素e為新的棧頂元素*/
{
    if(S.top - S.base >= S.stacksize) //棧已滿,追加記憶體分配
    {
    S.base = (SElemType *)relloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
    if(!S.base)
        exit(OVERFLOW); //記憶體分配失敗
    S.top = S.base + S.stacksize; //棧頂地址
    S.stacksize = S.stacksize + STACKINCREMENT; //當前棧的空間
    }
    *S.top++ = e; //將e插入棧頂
    return OK;
}
  • 在棧頂插入元素e:
Status Push(SqStack &S,SElemType &e); /*在棧S的棧頂插入元素e為新的棧頂元素*/
{
    if(S.top - S.base >= S.stacksize) //棧已滿,追加記憶體分配
    {
    S.base = (SElemType *)relloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
    if(!S.base)
        exit(OVERFLOW); //記憶體分配失敗
    S.top = S.base + S.stacksize; //棧頂地址
    S.stacksize = S.stacksize + STACKINCREMENT; //當前棧的空間
    }
    *S.top++ = e; //將e插入棧頂
    return OK;
  • 退棧並用e返回被刪除的棧頂元素:
Status Pop(SqStack &S,SElemType &e); /*若棧不為空,則刪除棧頂元素,用e返回此值,成功則返回OK,否則返回ERROR*/
{
    if(S.base == S.top)
        return ERROR;
    e = *--S.top; //把棧頂元素的值賦給e
    return OK;
}
  • 主函式:
int main(void)
{
    SqStack S;
    InitStack(&S);
    int choice;
    SElemType e;
    while(1)
    {
        printf("*************************************************\n");
        printf("*[1]棧的長度          [2]棧頂插入新元素             *\n");
        printf("*[3]將棧S清空         [4]銷燬棧S                  *\n");
        printf("*[5]退棧並返回其值     [6]獲得棧頂元素              *\n");
        printf("*                   [0]退出                     *\n");
        printf("*************************************************\n");
        scanf("%d",&choice);
        switch(choice)
        {
            case 0: break;

            case 1: StackLength(S);break;

            case 2: scanf("%d",&e);Push(&S,e);break;

            case 3: ClearStack(&S);break;

            case 4: DestoryStack(&S);break;

            case 5: Pop(&S,e);break;

            case 6: GetTop(s,e);break; 
        }
    }
return 0;
}