C数据结构——顺序栈 创建与基本使用

该文章提供了一个C语言实现的顺序栈数据结构,包括初始化、判断栈空、栈满、入栈、出栈、获取栈顶元素、计算栈长、清空栈和销毁栈等基本操作。代码中包含了详细的注释。
摘要由CSDN通过智能技术生成

源码+注释

//
// Created by Lenovo on 2022-03-22-下午 5:13.
// 作者:小象
// 版本:1.0
//

#include <malloc.h>
#include <stdio.h>

#define MAXSIZE 100 // 顺序栈存储空间的初始分配量

typedef enum {
    FALSE,
    TRUE
} boolean;

typedef int ElemType;

typedef struct { // 顺序栈的定义
    ElemType *base; // 栈底指针
    ElemType *top; // 栈顶指针
    int stackSize; // 栈可用的最大容量
} SqStack;

boolean InitStack(SqStack *stack); // 栈的初始化

boolean IsEmpty(SqStack *stack); // 判栈空

boolean IsFull(SqStack *stack); // 判栈满

boolean Push(SqStack *stack, ElemType elem); // 入栈

boolean Pop(SqStack *stack, ElemType *elem); // 出栈

ElemType GetTop(SqStack *stack); // 取栈顶元素

ElemType StackLen(SqStack *stack); // 计算当前栈的容量

boolean ClearStack(SqStack *stack); // 清空一个栈

void DestroyStack(SqStack *stack); // 销毁一个栈

/**
 * <h2>顺序栈的使用</h2>
 * @return 0
 */
int main() {

    // 以上已做实验验证,这里不再举例

    return 0;
}

// 构造一个空栈 stack
boolean InitStack(SqStack *stack) {
    stack->base = (ElemType *) malloc(sizeof(ElemType) * MAXSIZE); // 为顺序表动态分配一个最大容量为 MAXSIZE 的数组空间
    if (!(stack->base)) {
        return FALSE; // 存储分配失败
    }
    stack->top = stack->base; // top 初始为 base, 空栈
    stack->stackSize = MAXSIZE; // stackSize 置为栈的最大容量 MAXSIZE
    return TRUE;
}

boolean IsEmpty(SqStack *stack) {
    return stack->top == stack->base;
}

boolean IsFull(SqStack *stack) {
    return stack->top - stack->base == stack->stackSize;
}

// 插入元素 elem 为新的栈顶元素
boolean Push(SqStack *stack, ElemType elem) {
    if (IsFull(stack)) {
        return FALSE; // 栈满
    }
    *stack->top++ = elem; // 元素 elem 压入栈顶,栈顶指针加 1
    return TRUE;
}

// 删除 stack 的栈顶元素,用 elem 返回其值
boolean Pop(SqStack *stack, ElemType *elem) {
    if (IsEmpty(stack)) {
        return FALSE; // 栈空
    }
    *elem = *--stack->top; // 栈顶指针减 1, 将栈顶元素赋值给 elem
    return TRUE;
}

// 返回 stack 的栈顶元素,不修改栈顶指针
ElemType GetTop(SqStack *stack) {
    if (!(IsEmpty(stack))) { // 栈非空
        return *(stack->top - 1); // 返回栈顶元素的值,栈顶指针不变
    }
}

ElemType StackLen(SqStack *stack) {
    return stack->top - stack->base;
}

void DestroyStack(SqStack *stack) {
    int i, len;
    len = stack->stackSize;
    for (i = 0; i < len; i++) {
        free(stack->base);
        stack->base++;
    }
    stack->base = stack->top = NULL;
    stack->stackSize = 0;
}

boolean ClearStack(SqStack *stack) {
    if (IsEmpty(stack)) {
        return FALSE;
    }
    stack->top = stack->base;
    return TRUE;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小丶象

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值