数据结构之顺序栈

#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10   //存储空间分配增量
typedef struct
{
    int *base;     //栈底指针,在栈结构销毁之前,base值为NULL
    int *top;      //栈顶指针
    int stacksize; //当前已经分配的存储空间(总空间),以元素为单位
} SqStack;

//初始化顺序栈,构造空栈
int Init_Sq(SqStack &S)
{
    S.base = (int *)malloc(STACK_INIT_SIZE * sizeof(int)); //base指针指向这个区域,分配大小为int大小乘以最初分配的元素空间
    if (!S.base)
        return 0;                  //存储分配失败
    S.top = S.base;                //刚开始,栈顶指针和栈尾指针指向同一个元素
    S.stacksize = STACK_INIT_SIZE; //初始元素个数
    return 1;
}

int Destory_Sq(SqStack &S)
{
    free(S.base); //释放分配的空间
    S.base = NULL;
    S.top = NULL;
    S.stacksize = 0;
    return 1;
}

int Clear_Sq(SqStack &S)
{
    S.top = S.base; //栈顶指针与栈底指针指向同一元素
    return 1;
}

int IfEmpty_Sq(SqStack S)
{
    if (S.top == S.base)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int Length_Sq(SqStack S)
{
    return S.top - S.base;
}

//返回栈顶元素
int GetTop(SqStack S, int &e)
{
    if (S.top == S.base) //栈为空
    {
        return 0;
    }
    e = *(S.top - 1); //因为下标是从0开始的
    return 1;
}

int Push(SqStack &S, int e) //进栈
{
    if (S.top - S.base >= S.stacksize)
    {
        //栈满,增加存储空间
        S.base = (int *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(int));
        if (!S.base)
        {
            return 0;
        }
        S.top = S.base + S.stacksize; //指向该栈的栈顶
        S.stacksize = S.stacksize + STACKINCREMENT;
    }
    *(S.top) = e;
    S.top++;
    return 1;
}

int Pop(SqStack &S, int &e) //出栈
{
    if (S.top == S.base) //该栈本为空栈,没有元素可以出栈
    {
        return 0;
    }
    S.top--;      //先将该指针指向下一个位置(有元素)
    e = *(S.top); //得到值
    return 1;
}

int Traverse_Sq(SqStack S) //显示栈
{
    int *p = S.base;
    while (p < S.top)
    {
        printf("%d ", *p++);
    }
    printf("\n");
}

int main()
{
    SqStack S;
    int i;
    int e;
    int A;
    printf("+--------------------菜单---------------------+\n");
    printf("-         1.初始化顺序栈                            -\n");
    printf("-         2.销毁栈                            -\n");
    printf("-         3.置空栈                            -\n");
    printf("-         4.判断栈是否                        -\n");
    printf("-         5.返回栈中的元素个数                -\n");
    printf("-         6.返回栈顶元素                      -\n");
    printf("-         7.将元素e压入栈                     -\n");
    printf("-         8.出栈,用e返回其值                 -\n");
    printf("-         9.遍历/访问顺序栈                   -\n");
    printf("-         10.退出程序                         -\n");
    printf("+---------------------------------------------+\n");
    printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    for (i = 0;; i++)
    {
        printf("请选择要使用的功能:");
        scanf("%d", &A);
        if(A > 10)
        {
        	printf("没有该功能,请重新选择\n"); 
		}
        switch (A)
        {
        case 1:
            Init_Sq(S);
            if (Init_Sq(S))
            {
                printf("初始化成功\n");
            }
            else
            {
                printf("初始化失败\n");
            }
            break;

        case 2:
            Destory_Sq(S);
            printf("操作完成\n");
            break;

        case 3:
            Clear_Sq(S);
            printf("操作完成\n");
            break;

        case 4:
            IfEmpty_Sq(S);
            if (IfEmpty_Sq(S))
            {
                printf("该栈为空\n");
            }
            else
            {
                printf("该栈不为空\n");
            }
            break;

        case 5:
            int t;
            t = Length_Sq(S);
            printf("该栈中有%d个元素\n", t);
            break;

        case 6:
            GetTop(S,e);
            printf("栈顶元素为%d\n",e);
            break;
        
        case 7:
            printf("请输入e的值:",&e);
            scanf("%d",&e);
            Push(S,e);
            printf("操作完成\n");
            break;

        case 8:
            Pop(S,e);
            printf("操作元素为值为%d\n",e);
            break;

        case 9:
        Traverse_Sq(S);
        printf("操作完成\n");
        break;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值