顺序栈的表示和实现

来源:互联网 发布:java中class的作用 编辑:程序博客网 时间:2024/05/17 12:54
//库函数头文件包含#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     10typedef 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;}