順序棧(C語言)

棧的實現(順序棧,C語言)

結構體聲明:
typedef struct {

    ElemType *base; // 棧底元素指針
    ElemType *top;  // 棧頂指針
    int stacksize;  // 棧容量
    int cnt;        // 棧中元素數量

}SqStack;

其中棧底元素指針始終不變,棧頂指針指向棧頂元素的上方。
base = top, cnt = 0;時,棧爲空棧。
base = top = NULL;時,棧未初始化。

操作畫面:

下面放出代碼:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define STACKINITSIZE   100 // 儲存空間初始分配量
#define STACKINCREMENT  100 // 儲存空間分配增量

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR -1
#define OVERFLOW -2

typedef int ElemType;
typedef int Status;

typedef struct {

    ElemType *base; // 棧底指針
    ElemType *top;  // 棧頂指針
    int stacksize;  // 棧的容量
    int cnt;        // 棧當前元素個數

}SqStack;


/*
**          函數前向聲明
*/
SqStack *
InitStack();

Status
DestroyStack(SqStack *);

Status
ClearStack(SqStack *);

Status
StackEmpty(SqStack *);

int
StackLength(SqStack *);

Status
GetTop(SqStack *, ElemType *);

Status
AddStackSize(SqStack *);

Status
Push(SqStack *, ElemType);

Status
Pop(SqStack *, ElemType *);

Status
StackTraverse(const SqStack *);


/*
**          主函數,程序入口
*/
int main()
{
    SqStack *sqs = InitStack();
    ElemType e;

    for (int i = 0; i < 110; i++) {

        Push(sqs, i);

    }

    printf("目前棧長度:%d\n", StackLength(sqs));
    printf("遍歷棧:\n");
    StackTraverse(sqs);

    Pop(sqs, &e);
    printf("棧頂元素出棧:%d\n", e);
    printf("目前棧長度:%d\n", StackLength(sqs));

    DestroyStack(sqs);

    system("pause");
    return 0;
}

/*
**          函數定義
*/
SqStack *
InitStack() {

    /*
        構造一個空棧
    */

    SqStack *sqs;

    sqs = (SqStack *)malloc(sizeof(SqStack));

    if (!sqs) exit(OVERFLOW);

    sqs->base = (ElemType *)malloc(STACKINITSIZE * sizeof(ElemType));

    if (!(sqs->base)) exit(OVERFLOW);

    sqs->top = sqs->base;

    sqs->stacksize = STACKINITSIZE;

    sqs->cnt = 0;

    return sqs;

}

Status
DestroyStack(SqStack *sqs) {

    /*
        銷燬棧,釋放資源
    */

    assert(sqs != NULL);

    free(sqs->base);
    sqs->base = NULL;
    sqs->top = NULL;

    free(sqs);
    sqs = NULL;

    printf("棧已成功銷燬\n");

    return OK;

}

Status
ClearStack(SqStack *sqs) {

    assert(sqs != NULL);

    sqs->top = sqs->base;

    sqs->cnt = 0;

    return OK;

}

Status
StackEmpty(SqStack *sqs) {

    /*
        若棧爲空棧,返回TRUE,否則返回FALSE
    */

    assert(sqs != NULL);

    if (sqs->cnt == 0)
        return TRUE;
    else
        return FALSE;

}

int
StackLength(SqStack *sqs) {

    /*
        返回棧元素的個數,即棧的長度
    */

    assert(sqs != NULL);

    return sqs->cnt;

}

Status
GetTop(SqStack *sqs, ElemType *e) {

    /*
        若棧不空,用e返回棧頂元素,並返回OK;否則返回ERROR
    */

    assert(sqs != NULL);

    assert(e != NULL);

    if (StackEmpty(sqs))
        return ERROR;

    *e = *(sqs->top - 1);

    return OK;

}

Status
AddStackSize(SqStack *sqs) {

    /*
        增加棧的容量
    */

    assert(sqs != NULL);

    ElemType *add = (ElemType *)realloc(sqs->base,
        (sqs->stacksize + STACKINCREMENT) * sizeof(ElemType));

    if (!add) exit(OVERFLOW);

    sqs->base = add;
    sqs->stacksize += STACKINCREMENT;

    printf("棧容量自動擴充\n");

    return OK;

}

Status
Push(SqStack *sqs, ElemType e) {

    /*
        插入元素e爲新的棧頂元素
    */

    assert(sqs != NULL);

    if (sqs->cnt == sqs->stacksize)
        AddStackSize(sqs);

    *(sqs->top) = e;

    (sqs->top)++;

    (sqs->cnt)++;

    return OK;

}

Status
Pop(SqStack *sqs, ElemType *e) {

    /*
        若棧不空,則刪除棧頂元素,用e返回其值
    */

    assert(sqs != NULL);

    if (StackEmpty(sqs))
        return ERROR;

    (sqs->top)--;

    (sqs->cnt)--;

    *e = *(sqs->top);

    return OK;

}

Status
StackTraverse(const SqStack *sqs) {

    /*
        從棧底到棧頂依次遍歷棧
    */

    assert(sqs != NULL);

    ElemType *tmp = sqs->base;

    for (; tmp != (sqs->top); tmp++) {

        printf("%d\t", *tmp);

    }

    return OK;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章