C语言数据结构练习题之基本实战栈的入栈和出栈功能

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

基本实现

示例代码:main.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;
}

void pushStack(Stack* stack, int value){
    stack -> arr[stack -> top] = value;
    stack -> top ++;
}

int popStack(Stack* stack){
    int value = stack -> arr[stack -> top - 1];
    stack -> top --;
    return value;
}

int main(){
    Stack* stack = newStack(3);
    pushStack(stack, 111);
    int value = popStack(stack);
    printf("value=%d\n", value);

    freeStack(stack);

    return 0;
}

编译并执行:

gcc main.c -o test && ./test

输出:

value=111
核心代码:栈结构

定义栈类型的数据结构: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;
}
核心代码:入栈方法

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

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

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

void pushStack(Stack* stack, int value){
    stack -> arr[stack -> top] = value;
    stack -> top ++;
}

目前方法的缺点:

  • 没有处理当栈对象是个空指针的情况
  • 没有处理当栈已经满了的情况
核心代码:出栈方法

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

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

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

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

int popStack(Stack* stack){
    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);
    int value = popStack(stack);
    printf("value=%d\n", value);

    freeStack(stack);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/609064.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis-新数据类型-Geospatia

新数据类型-Geospatia 简介 GEO&#xff0c;Geographic,地理信息的缩写。 该类型就是元素的二维坐标&#xff0c;在地图上就是经纬度。Redis基于该类型&#xff0c;提供了经纬度设置、查询、范围 查询、距离查询、经纬度Hash等常见操作。 常用命令 geoadd key longitude lat…

python循环结构练习

目录 前言 1、使用while实现模拟用户登录 1.1 题目要求 1.2 解题 2、输入数字&#xff0c;生成对应等腰三角形 2.1 题目要求 2.2 解题 3、输入数字&#xff0c;生成对应的菱形 3.1 题目要求 3.2 解题 总结 前言 本系列主要是讲解python中的题目&#xff0c;目的是为…

c++ libtorch使用cmake建立

如果我们安装好pytorch&#xff0c;其实不一定一定要安装libtorch&#xff0c;默认都已经安装过了 1 进入pytorch conda env list conda activate pytorch 命令行下使用 python -c 来获取libtorch的基本信息&#xff0c; python -c "import torch;print(torch.utils.c…

uniapp:抖音PK进度条(nvue)

nvue中,仿抖音PK进度条效果, <template><view class="index" :style="{width:windowWidth+px,height:index_windowHeight+px,paddingTop:windowTop+px}"><view class="pk"><text class="pk_jindu_left_val fsz-24 …

������森林消防泵:特点及使用场景 /恒峰智慧科技������

在大自然的怀抱中&#xff0c;森林是地球上最美丽的绿色家园。然而&#xff0c;森林火灾却时常威胁着这片美丽的家园。为了保护森林&#xff0c;我们有幸拥有了一支强大的森林消防泵队伍。今天&#xff0c;就让我们一起来了解一下这些守护者们的故事吧&#xff01; &#xfffd…

OpenHarmony 3.2 Release版本实战开发——Codec HDI适配过程

简介 OpenHarmony Codec HDI&#xff08;Hardware Device Interface&#xff09;驱动框架基于 OpenMax 实现了视屏硬件编解码驱动&#xff0c;提供 Codec 基础能力接口供上层媒体服务调用&#xff0c;包括获取组件编解码能力、创建组件、参数设置、数据的轮转和控制、以及销毁…

晶片的厚度会影响晶振的频率吗?

晶振&#xff0c;是一种能够产生稳定频率的电子元件&#xff0c;广泛应用于各种电子设备中。晶振的频率参数&#xff0c;即其振荡产生的频率大小&#xff0c;是晶振性能的重要指标之一。石英晶体的切割方式显得至关重要。不同的切割方式&#xff0c;如AT-cut、CT-cut、SC-cut等…

文心一言 VS 讯飞星火 VS chatgpt (255)-- 算法导论18.1 1题

一、请说明依次从图18-8(f)中删除C、P和V后的结果。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 首先&#xff0c;让我们明确一点&#xff1a;由于您没有提供具体的图18-8(f)的内容&#xff0c;我只能假设它是一个数据结构&#xff08;可能是图、树或列表等&…

1011: 二叉排序树的实现和查找

解法&#xff1a; 二叉排序树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;也被称为二叉搜索树或二叉查找树&#xff0c;是一种重要的二叉树结构&#xff0c;它具有以下性质&#xff1a; 左子树上所有节点的值都小于根节点的值&#xff1b;右子树上所有节点的…

网络编程套接字和传输层tcp,udp协议

认识端口号 我们知道在网络数据传输的时候&#xff0c;在IP数据包头部有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。IP地址是帮助我们在网络中确定最终发送的主机&#xff0c;但是实际上数据应该发送到主机上指定的进程上的&#xff0c;所以我们不仅要确定主机&…

单片机智能灯控制系统源程序仿真原理图与论文全套资料

目录 1、设计描述 2、仿真图 3、程序 4、资料内容 资料下载地址&#xff1a;单片机智能灯控制系统源程序仿真原理图与论文全套资料下载 1、设计描述 设计了一款智能控制系统。 AT89C51LCD1602DS1302按键LED组成了这样一个完整的设计。 P2.0-P2.3 4个LED等代表庭院内的4…

Mock.js 问题记录

文章目录 Mock.js 问题记录1. 浮点数范围限制对小数不起效2. increment 全局共用 Mock.js 问题记录 最新写网页的时候引入了 Mock.js 来生成模拟数据&#xff1b; Mock使用起来很方便&#xff0c;具体可以参考 官网 很快就能上手&#xff0c; 但是这个项目最近一次提交还是在2…

Windows 跨服务器进行 MYSQL备份脚本

Windows 服务器进行 MYSQL备份的脚本&#xff0c;使用该脚本前&#xff0c;请先测试一下 1、新建一个文本文档 2、将下面代码放入文本文档中&#xff0c;保存退出 echo off :: 命令窗口名 title mysql-bak:: 参数定义 set "Y%date:~,4%" set "m%date:~5,2%&qu…

公司服务器内网OA网站如何实现外网访问?

目前很多公司会用windows自带的IIS搭建局域网ftp服务器&#xff0c;并搭建WEB服务办公网站。公司内部OA服务器&#xff0c;在公司内网是可以正常访问的&#xff0c;如何将公司内部的OA服务器映射到internet网络&#xff0c;让不在公司的企业员工可以正常访问到内部的OA服务器&a…

你用什么笔记软件记录自己的成长过程?

大家好,这里是大话硬件。祝大家新年好! 前两天我们在群里谈到记笔记的软件,其中有人记日记一开始是使用手写,后面改为电子笔记软件。作为一个知识型的博主,在笔记软件方面属于深度用户,有些笔记软件会员充到了几年后,在多年的使用中,总结了一些方法。 基于上次聊到的…

未授权访问:Jenkins未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 4、利用未授权访问写入webshell 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬总结好…

Visual Studio编译QT工程

1、安装QT 2、安装VS 3、选择扩展和更新 4、搜索Qt Visual Studio Tools&#xff0c;安装或卸载 5、安装成功后工具栏显示Qt VS Tools 6、配置Qt VS Tools&#xff1a;打开Qt VS Tools的下拉菜单&#xff0c;选择Qt Versions 7、选择qt qmake.exe 的路径

【知识碎片】2024_05_09

本篇记录了关于C语言的一些题目&#xff08;puts&#xff0c;printf函数的返回值&#xff0c;getchar&#xff0c;跳出多重循环&#xff09;&#xff0c;和一道关于位运算的代码&#xff3b;整数转换&#xff3d;。 C语言碎片知识 如下程序的功能是&#xff08; &#xff09; #…

通过编写dockerfile部署python项目

docker命令总览 docker通过dockerfile构建镜像常用命令 # 创建镜像&#xff08;进入dockerfile所在的路径&#xff09; docker build -t my_image:1.0 .# 查看镜像 docker images# 创建容器 docker run -dit --restartalways -p 9700:9700 --name my_container my_image:1.0 #…

互动科技如何强化法治教育基地体验?

近年来&#xff0c;多媒体互动技术正日益融入我们生活的各个角落&#xff0c;法治教育领域亦不例外。步入法治教育基地&#xff0c;我们不难发现&#xff0c;众多创新的多媒体互动装置如雨后春笋般涌现&#xff0c;这些装置凭借前沿的科技手段&#xff0c;不仅极大地丰富了法制…
最新文章