顺序栈的表示和实现

//库函数头文件包含
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

//状态码的定义
#define TRUE             1
#define FALSE            0
#define OK               1
#define ERROR            0
#define INFEASIBLE      -1
#define OVERFLOW        -2
#define STACKINITSIZE    3
#define ADDSTACKSIZE     10

typedef int SElemType;
typedef int Status;

//栈结构的定义
typedef struct Stack{
    SElemType *base;
    SElemType *top;
    int LengthOfStack;
}Stack;

//构造一个空栈
Status InitStack(Stack &S){
    S.base = (SElemType *)malloc(STACKINITSIZE * sizeof(SElemType));  //开辟一段空间
    if(!S.base)
        exit(OVERFLOW);                                               //储存分配失败
    S.top = S.base;                                                   //使栈顶指针指向栈底
    S.LengthOfStack = STACKINITSIZE;                                  //记录开辟的空间的大小
    return OK;
}

//栈的销毁
Status DestroyStack(Stack &S){
    S.top = S.base;             //将栈顶指针指向栈底
    free(S.base);               //释放开辟的空间
    S.LengthOfStack = 0;        //将最大容量改为0
    return OK;
}

//清空栈
Status ClearStack(Stack &S){
    S.top = S.base;             //直接将栈顶指针指向栈底,就相当于栈被清空
    return OK;
}

//判断栈长度
Status StackLength(Stack S){
    return S.top - S.base;
}

//判断栈空
bool Is_StackEmpty(Stack S){
    if(S.base == S.top)
        return true;
    return false;
}

//获得栈顶元素的值
SElemType GetTop(Stack &S){
    if(S.base == S.top)
        return ERROR;
    return *(S.top - 1);
}

//入栈
Status Push(Stack &S, SElemType elem){
    if(StackLength(S) >= S.LengthOfStack){
        S.LengthOfStack += ADDSTACKSIZE;
        S.base = (SElemType *)realloc(S.base, (S.LengthOfStack) * sizeof(SElemType));
        if(!S.base)
            exit(OVERFLOW);
    }
    *S.top = elem;
    S.top++;
    return OK;
}

//出栈
Status Pop(Stack &S, SElemType &elem){
    if(S.base == S.top)
        return ERROR;
    elem = *(S.top - 1);
    S.top--;
    return OK;
}

//遍历函数
Status visit(SElemType elem){
    printf("%d ", elem);
    return OK;
}

//遍历栈
Status StackTraverse(Stack S, Status (*visit)(SElemType)){
    SElemType e;
    while(!Is_StackEmpty(S)){
        if(visit(GetTop(S)) == ERROR)
            return ERROR;
        Pop(S, e);
    }
    return OK;
}

//主函数
int main(){
    Stack S;
    InitStack(S);
    int a;
    printf("输入5个数字:\n");
    for(int i = 0; i < 5; i++){
        scanf("%d", &a);
        Push(S, a);
    }

    printf("下面是执行遍历操作的输出结果:\n");
    StackTraverse(S, visit);

    printf("\n下面是返回栈长的结果:\n");
    printf("%d\n", StackLength(S));

    printf("下面是执行出栈后遍历的结果:\n");
    Pop(S, a);
    StackTraverse(S, visit);

    printf("\n下面是获得栈顶元素的操作:\n%d\n", GetTop(S));

    printf("下面是判断栈是否为空的操作(空输出YES,不空输出NO和栈长):\n");
    if(Is_StackEmpty(S))
        printf("YES");
    else
        printf("NO  %d", StackLength(S));
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值