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

2024-05-11 16:12

本文主要是介绍C语言数据结构与算法之栈练习2:判断栈是否为空或者是否已满,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

完整代码
#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;
}

输出结果:

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;

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;

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;

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;
}
核心代码:判断栈是否为空方法

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

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 ++;

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;

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);

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;
}

这篇关于C语言数据结构与算法之栈练习2:判断栈是否为空或者是否已满的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980023

相关文章

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n