棧的順序存儲結構實現


棧的順序存儲結構實現

用數組來實現棧,首先定義棧類型SqStack,里面有兩個指針,一個指向棧底,這個棧底初始化后將被指向數組指針,即第一個數組元素。而另一個一個指針指向棧頂,隨着新元素不斷被push進來,棧頂指針不斷往上漲如何判斷滿棧了呢,那就要用到SqStack里面的第三個元素stacksize,它指明占空間的大小,即讓top指針減去base指針的差去和stacksize比較,如果大於棧空間,則需要重新分配數組大小。同樣對於棧的pop則將棧頂元素索取出來並讓top減1,如下圖所示,top的位置總是數據的上面,所以棧頂的數據應該是top-1。先檢測top是否和base相等,因為這是空棧的條件,如果不等,則top必然在base上面,且棧不為空,top-1的位置就當然是棧頂的元素位置。對於獲取棧中的數據長度,就是讓top-base就可以了。
圖示:棧的狀態示意圖

示例代碼

#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status;
typedef int SElemType;

#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10

typedef struct 
{
    SElemType *base; /* 在棧構造之前和銷毀之后,base值為NULL */
    SElemType *top;  /* 棧頂指針 */
    int stacksize;   /* 當前已分配的存儲空間,以元素為單位 */
}SqStack;

/* 構造一個空戰 */
Status InitStack(SqStack *S)
{
    S->base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S->base) 
        return ERROR;
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
    return OK;
}

/* 銷毀棧S,S不再存在 */
Status DestoryStack(SqStack *S)
{
    if(!S->base)
        return ERROR;
    free(S->base);
    S->base = NULL;
    S->top = NULL;
    S->stacksize = 0;
    return OK;
}

/* 把棧S置為空棧 */
Status ClearStack(SqStack *S)
{   
    if(!S->base)
        return ERROR;
     S->top =  S->base;
    return OK;
}

/* 如果棧為空則返回TRUE,否則返回FALSE */
Status StackEmpty(SqStack *S)
{
    if(!S->base)
        return ERROR;
    if( S->top ==  S->base)
        return TRUE;
    else 
        return FALSE;
}

/* 返回棧的長度 */
int StackLength(SqStack *S)
{
    if(!S->base)
        return ERROR;
    return S->top - S->base;
}

/* 若棧不為空,則用e返回S的棧頂元素,並返回OK,否則返回ERROR */
Status GetTop(SqStack *S, SElemType *e)
{
    if(!S->base || S->top == S->base) 
        return ERROR;
    *e = *(S->top-1);
    return OK;
}

/* 插入元素e為新的棧頂 */
Status Push(SqStack *S, SElemType e)
{
    if( S->top - S->base >= S->stacksize ) { /* 棧滿,追加存儲空間 */
        SElemType * ptr = (SElemType *)realloc( S->base,
            (S->stacksize + STACK_INCREMENT)*sizeof(SElemType) );
        if(!ptr)
            return ERROR;
        S->base = ptr;
        S->top = S->base + S->stacksize; /* top重新指向新的地址 */
        S->stacksize += STACK_INCREMENT;
    }
    *(S->top) = e;
    S->top++;
    return OK;    
}

/* 若棧不空,則彈出棧頂元素,用e保存返回值 */
Status Pop(SqStack *S,SElemType *e)
{
    if(S->top == S->base) /* 棧空了 */
        return ERROR;
    *e = *(S->top-1);
    S->top--;
    return OK;
}

/* 從棧頂往下打印棧中的數據 */
void printSqStack(SqStack *S)
{
    SElemType * p = S->top;
    while (p != S->base) {
        printf("%d ",*(p-1));
        p--;
    }
    printf("\n");
}

int main()
{
    SqStack S;
    SqStack * pS = &S;
    SElemType e;

    // 初始化棧
    InitStack(pS);
    
    // push 測試
    for(int i=1;i<=110;i++) {
        Push(pS,i);
    }

    // 獲取棧長度測試
    printf("len %d\n",StackLength(pS));

    // 彈出棧頂 
    Pop(pS,&e);
    printf("pop %d\n",e);

    // 打印棧測試
    printSqStack(pS);

    // 獲取棧頂測試
    GetTop(pS,&e);
    printf("top %d\n",e);

    // 銷毀測試
    DestoryStack(pS);
    printf("\nreturn 0\n");
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM