栈的顺序存储结构的实现

要求:利用书本上的栈的顺序存储结构定义,

#define STACK_INIT_SIZE 100 // 存储空间初始分配量

typedef struct {

SElemType   *base; // base的初值为NULL

SElemType    *top; // 栈顶指针

int      stacksize; // 当前已分配的存储空间,以元素为单位

} SqStack;

1)编写完成下列功能的函数:(1)初始化一个空栈;(2)随机创建一个包含正整数值的栈(当输入-1时创建结束);(3)将一个数x插在栈顶(x在程序运行时输入);(4)将栈顶元素弹出, 并在弹出结束后输出弹出元素的值;(5)输出栈顶元素的值;(6)求栈的长度;(7)输出从栈底到栈顶的所有元素。

2)用主函数调用你所编写的函数,并在使栈有所变化的每一步输出栈从栈顶到栈底的所有元素,以验证你编程序的正确性。

备注:(1)要求编一菜单,根据选项逐个调用各函数;(2)所编程序要具有一定的健壮性,即:在插入删除时要考虑栈空、栈满、位置是否合法等情况,当输入数据非法时,程序也能适当的做出反应,而不致于出现莫名其妙的结果。

#include <stdio.h>

#include <stdlib.h>



#define STACK_INIT_SIZE 100 // 存储空间初始分配量

#define SElemType int



typedef struct {

    SElemType *base; // base的初值为NULL

    SElemType *top; // 栈顶指针

    int stacksize; // 当前已分配的存储空间,以元素为单位

} SqStack;



// 初始化一个空栈

void InitStack(SqStack *S) {

    S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));

    if (!S->base) {

        exit(1); // 分配失败

    }

    S->top = S->base;

    S->stacksize = STACK_INIT_SIZE;

}



// 销毁栈

void DestroyStack(SqStack *S) {

    free(S->base);

    S->base = S->top = NULL;

    S->stacksize = 0;

}



// 入栈

void Push(SqStack *S, SElemType x) {

    if (S->top - S->base >= S->stacksize) {

        // 栈满,需要扩容

        S->base = (SElemType *)realloc(S->base, (S->stacksize + STACK_INIT_SIZE) * sizeof(SElemType));

        if (!S->base) {

            exit(1); // 内存分配失败

        }

        S->top = S->base + S->stacksize;

        S->stacksize += STACK_INIT_SIZE;

    }

    *(S->top) = x;

    S->top++;

}



// 出栈

SElemType Pop(SqStack *S) {

    if (S->top == S->base) {

        // 栈空,无法出栈

        exit(1);

    }

    S->top--;

    SElemType x = *(S->top);

    return x;

}



// 获取栈顶元素

SElemType GetTop(SqStack *S) {

    if (S->top == S->base) {

        // 栈空,无栈顶元素

        exit(1);

    }

    return *(S->top - 1);

}



// 获取栈的长度

int StackLength(SqStack *S) {

    return S->top - S->base;

}



// 输出栈的所有元素

void PrintStack(SqStack *S) {

    SElemType *p = S->base;

    while (p < S->top) {

        printf("%d ", *p);

        p++;

    }

    printf("\n");

}



int main() {

    SqStack S;

    InitStack(&S);



    int choice;

    SElemType x;



    do {

        printf("\nMenu:\n");

        printf("1. Push\n");

        printf("2. Pop\n");

        printf("3. Get Top\n");

        printf("4. Stack Length\n");

        printf("5. Print Stack\n");

        printf("0. Exit\n");

        printf("Enter your choice: ");

        scanf("%d", &choice);



        switch (choice) {

            case 1:

                printf("Enter the element to push: ");

                scanf("%d", &x);

                Push(&S, x);

                break;

            case 2:

                x = Pop(&S);

                printf("Popped element: %d\n", x);

                break;

            case 3:

                x = GetTop(&S);

                printf("Top element: %d\n", x);

                break;

            case 4:

                printf("Stack Length: %d\n", StackLength(&S));

                break;

            case 5:

                printf("Stack Elements: ");

                PrintStack(&S);

                break;

            case 0:

                DestroyStack(&S);

                break;

            default:

                printf("Invalid choice!\n");

                break;

        }

    } while (choice != 0);



    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值