C语言数据结构与算法之栈练习2:判断栈是否为空或者是否已满

练习2:判断栈是否为空或者是否已满

需求1:实现一个简单的栈结构,并实现入栈和出栈的功能,编写相关的代码进行测试。

需求2:如果栈已满,则不要再继续入栈,并提示错误信息。如果栈为空,则不要出栈,并提示错误信息。错误信息要输出到标准错误流。

需求3:编写代码,分别覆盖栈已满和栈为空的情况。

完整代码
c 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct stack {
    int* arr;
    int cap;
    int top;
} Stack;

Stack* newStack(int cap){
    Stack* stack = malloc(sizeof(Stack));
    stack -> arr = malloc(sizeof(int) * cap);
    stack -> cap = cap;
    stack -> top = 0;

    return stack;
}

void freeStack(Stack* stack){
    free(stack -> arr);
    stack -> cap = 0;
    stack -> top = 0;
    free(stack);
    stack = NULL;
}

int isFullStack(Stack* stack){
    return stack != NULL && stack -> top == stack -> cap;
}

int isEmptyStack(Stack* stack){
    return stack != NULL && stack -> top == 0;
}

void pushStack(Stack* stack, int value){
    if (isFullStack(stack)){
        fprintf(stderr, "the stack is full\n");
        return;
    }
    stack -> arr[stack -> top] = value;
    stack -> top ++;
}

int popStack(Stack* stack){
    if (isEmptyStack(stack)){
        fprintf(stderr, "the stack is empty\n");
        return -1;
    }
    int value = stack -> arr[stack -> top - 1];
    stack -> top --;
    return value;
}

int main(){
    Stack* stack = newStack(3);
    
    pushStack(stack, 111);
    pushStack(stack, 222);
    pushStack(stack, 333);
    pushStack(stack, 333333);

    int value;
    
    value = popStack(stack);
    printf("value=%d\n", value);
    value = popStack(stack);
    printf("value=%d\n", value);
    value = popStack(stack);
    printf("value=%d\n", value);
    value = popStack(stack);
    printf("value=%d\n", value);

    freeStack(stack);

    return 0;
}

输出结果:

bash 复制代码
the stack is full
value=333
value=222
value=111
the stack is empty
value=-1
核心代码:栈结构

定义栈类型的数据结构:typedef struct stack {

声明一个int类型的地址,用来存储栈的内容:int* arr;

声明栈的容量:int cap;

声明栈顶:int top;

给栈类型的结构体取个别名:} Stack;

c 复制代码
typedef struct stack {
    int* arr;
    int cap;
    int top;
} Stack;
核心代码:新建栈方法

定义新建栈的方法:Stack* newStack(int cap){

从内存中开辟一个空间,用来存储栈的信息:Stack* stack = malloc(sizeof(Stack));

从内存中开辟一个空间,用来存储栈数组容器的信息:stack -> arr = malloc(sizeof(int) * cap);

记录栈的容量:stack -> cap = cap;

记录栈顶:stack -> top = 0;

返回新建的栈:return stack;

c 复制代码
Stack* newStack(int cap){
    Stack* stack = malloc(sizeof(Stack));
    stack -> arr = malloc(sizeof(int) * cap);
    stack -> cap = cap;
    stack -> top = 0;

    return stack;
}
核心代码:释放栈方法

声明释放栈的方法:void freeStack(Stack* stack){

释放栈的数组容器内存:free(stack -> arr);

栈的容量归零:stack -> cap = 0;

栈顶归零:stack -> top = 0;

释放栈本身的内存:free(stack);

将栈的地址置空,防止野指针:stack = NULL;

c 复制代码
void freeStack(Stack* stack){
    free(stack -> arr);
    stack -> cap = 0;
    stack -> top = 0;
    free(stack);
    stack = NULL;
}
核心代码:判断栈是否已满方法

如果栈不是空指针,并且栈顶位置和容器容量相同,则说明栈已经满了。

正常情况下,栈顶位置应该小于栈容量。

c 复制代码
int isFullStack(Stack* stack){
    return stack != NULL && stack -> top == stack -> cap;
}
核心代码:判断栈是否为空方法

如果栈不是空指针,或者栈顶位置在0,则说明这个栈是个空栈。

c 复制代码
int isEmptyStack(Stack* stack){
    return stack != NULL && stack -> top == 0;
}
核心代码:入栈方法

声明入栈的方法:void pushStack(Stack* stack, int value){

判断栈是否已满:if (isFullStack(stack)){

将数据添加到栈顶的位置:stack -> arr[stack -> top] = value;

栈顶的位置自增:stack -> top ++;

c 复制代码
void pushStack(Stack* stack, int value){
    if (isFullStack(stack)){
        fprintf(stderr, "the stack is full\n");
        return;
    }
    stack -> arr[stack -> top] = value;
    stack -> top ++;
}
核心代码:出栈方法

声明出栈的方法:int popStack(Stack* stack){

判断栈是否为空:if (isEmptyStack(stack)){

获取栈顶的元素:int value = stack -> arr[stack -> top - 1];

栈顶自减:stack -> top --;

返回获取到的元素:return value;

c 复制代码
int popStack(Stack* stack){
    if (isEmptyStack(stack)){
        fprintf(stderr, "the stack is empty\n");
        return -1;
    }
    int value = stack -> arr[stack -> top - 1];
    stack -> top --;
    return value;
}
核心代码:测试方法

新建容量为3的栈对象:Stack* stack = newStack(3);

向栈中追加四条数据:pushStack(stack, 111);

弹出四次栈中的栈顶元素:int value = popStack(stack);

查看栈顶元素:printf("value=%d\n", value);

释放栈:freeStack(stack);

c 复制代码
int main(){
    Stack* stack = newStack(3);
    
    pushStack(stack, 111);
    pushStack(stack, 222);
    pushStack(stack, 333);
    pushStack(stack, 333333);

    int value;
    
    value = popStack(stack);
    printf("value=%d\n", value);
    value = popStack(stack);
    printf("value=%d\n", value);
    value = popStack(stack);
    printf("value=%d\n", value);
    value = popStack(stack);
    printf("value=%d\n", value);

    freeStack(stack);

    return 0;
}
相关推荐
008爬虫实战录9 分钟前
【数据结构】 树、二叉树、完全二叉树,先序遍历、中序遍历、后序遍历
数据结构·算法
小O的算法实验室11 分钟前
2024年AST,基于费马点分组粒子群算法的复合型无人机统一路径规划
算法·无人机
AllData公司负责人26 分钟前
大模型赋能AllData数据中台,系列升级|通过联合智谱大模型与BiSheng开源项目,建设企业大模型应用开发平台,支持知识库向量检索!
大数据·数据结构·数据库·算法·大模型·向量数据库·智谱ai
一个王同学32 分钟前
从零到一 | CV转多模态大模型 | week12 | 整理 MiniLLaVA 工程与文档
人工智能·深度学习·算法·机器学习·计算机视觉
这料鬼有毒39 分钟前
二刷hot100-78.子集
算法·leetcode·职场和发展
ZHW_AI课题组1 小时前
使用DBSCAN算法对纽约市 Airbnb 房源数据集进行聚类分析
算法
蓦然回首却已人去楼空2 小时前
【分词:中文分词】BPE字节级分词算法实现汉字表达!
java·算法·中文分词
3DVisionary2 小时前
aero-engine-blade-thermal-fatigue-dic-inspection
人工智能·算法·机器学习·航空发动机·高温dic·涡轮叶片·热疲劳
Kurisu5752 小时前
深度拆解:从二进制切片到并发控制,大文件断点续传的底层工程设计
算法