顺序栈(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;

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值