顺序栈的基础操作

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0

typedef int Status;
typedef int SElemType;

typedef struct
{
    SElemType *base;   // 栈底指针
    SElemType *top;    // 栈顶指针
    int stacksize;     // 栈当前可用最大容量
} SqStack;

Status InitStack(SqStack *S)    // 栈的初始化
{
    S->base = (SElemType *)malloc(MAXSIZE * sizeof(SElemType));
    if (!S->base)
        exit(ERROR);
    S->top = S->base;
    S->stacksize = MAXSIZE;
    return OK;
}

Status IsEmpty(SqStack *S)    // 判断栈是否空
{
    return S->top == S->base;
}

Status IsFull(SqStack *S)    // 判断栈是否满
{
    return S->top - S->base >= S->stacksize;
}

Status Push(SqStack *S, SElemType e)    // 元素入栈
{
    if (IsFull(S))
    {
        S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
        if (!S->base)
            return ERROR;
        S->top = S->base + S->stacksize;
        S->stacksize += STACKINCREMENT;
    }
    *(S->top++) = e;
    return OK;
}

Status Pop(SqStack *S, SElemType *e)    // 栈顶元素出栈
{
    if (IsEmpty(S))
        return ERROR;
    *e = *(S->top - 1);
    S->top--;
    return OK;
}

Status GetTop(SqStack *S, SElemType *e)    // 获得栈顶元素
{
    if (S->top != S->base)
    {
        *e = *(S->top - 1);
        return OK;
    }
    else
    {
        return ERROR;
    }
}

void Menu()
{
    printf("------- 顺序栈操作菜单 -------\n");
    printf("1. 判断栈是否空\n");
    printf("2. 判断栈是否满\n");
    printf("3. 元素入栈\n");
    printf("4. 元素出栈\n");
    printf("5. 取栈顶元素\n");
    printf("0. 退出\n");
    printf("---------------------------\n");
    printf("请选择操作:");
}

int main()
{
    SqStack S;
    SElemType e = 0;
    int x;
    InitStack(&S);

    do
    {
        Menu();
        scanf("%d", &x);

        switch (x)
        {
        case 1:
            if (IsEmpty(&S))
            {
                printf("栈为空.\n");
            }
            else
            {
                printf("栈不空.\n");
            }
            break;

        case 2:
            if (IsFull(&S))
            {
                printf("栈已经满了.\n");
            }
            else
            {
                printf("栈还没满.\n");
            }
            break;

        case 3:
            printf("请输入需要入栈的元素:\n");
            scanf("\n%c", &e);
            if (Push(&S, e))
            {
                printf("入栈成功.\n");
            }
            else
            {
                printf("入栈失败.\n");
            }
            break;

        case 4:
            if (Pop(&S, &e))
            {
                printf("出栈的元素: %c\n", e);
            }
            else
            {
                printf("出栈失败.\n");
            }
            break;

        case 5:
            if (GetTop(&S, &e))
            {
                printf("栈顶元素为: %c\n", e);
            }
            else
            {
                printf("栈顶没有元素\n");
            }
            break;

        case 0:
            printf("程序已退出.\n");
            break;
        }

    } while (x != 0);

    return 0;
}

注意事项:

        这是一个基于C语言实现的顺序栈程序,通过调用不同的函数实现了顺序栈的初始化、判空、判满、入栈、出栈和取栈顶元素等操作。代码中使用了动态内存分配和realloc函数来动态扩展栈的存储空间,使得栈能够动态地调整大小。
        此外,代码中还提供了一个简单的操作菜单,让用户可以选择对栈进行不同的操作。用户可以选择判断栈是否空、判断栈是否满、元素入栈、元素出栈、取栈顶元素和退出等选项,根据用户的选择调用相应的栈操作函数。
        需要注意的是,代码中使用了字符类型的元素来进行栈的操作,即SElemType类型为char。在菜单中,用户可以输入字符来进行入栈操作,并且在出栈和取栈顶元素时显示相应的字符。如果需要修改为其他数据类型的栈,可以相应地修改SElemType的类型定义,并修改输入输出格式及函数参数类型。

运行结果:

         这是一个使用C语言实现的顺序栈程序,它实现了顺序栈的初始化、判空、判满、入栈、出栈和取栈顶元素等操作。
        首先定义了栈的数据结构类型SqStack,并定义了栈中元素的类型SElemType和操作状态类型Status;然后实现了初始化栈InitStack函数,用于初始化一个顺序栈;接下来分别实现了判断栈空IsEmpty、判断栈满IsFull、元素入栈Push、元素出栈Pop、取栈顶元素GetTop等操作函数;Menu函数用于显示操作菜单,包括判断栈是否空、判断栈是否满、元素入栈、元素出栈、取栈顶元素和退出等选项。
        main函数中创建了一个顺序栈对象S,然后通过循环菜单的方式让用户选择对栈的操作,包括判断栈是否空、判断栈是否满、元素入栈、元素出栈、取栈顶元素和退出等选项。
        整体来说,这段代码实现了一个顺序栈的基本操作,并通过菜单的形式提供给用户使用。在输入菜单选项后,会根据用户的选择调用相应的栈操作函数,对顺序栈进行操作并输出相应的结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值