初阶数据结构(C语言实现)——4.1栈

目录

  • 1.栈
    • 1.1栈的概念及结构
    • 1.2 栈的实现
      • 1.1.0 栈的初始化
      • 1.1.1 销毁
      • 1.1.2 入栈
      • 1.1.3 出栈
      • 1.1.4 获取栈中有效元素个数
      • 1.1.5 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
      • 1.1.6 获取栈顶元素
      • 1.1.7 验证
  • 附录 栈的C语言实现源码
    • .h文件
    • .c文件
    • test.c文件

1.栈

1.1栈的概念及结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

  • 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
  • 出栈:栈的删除操作叫做出栈。出数据也在栈顶

在这里插入图片描述

1.2 栈的实现

在VS2022中新建一个工程

  • stack20250308.h(栈的类型定义、接口函数声明、引用的头文件)
  • stack20250308.c(栈的接口函数的实现)
  • stackTest20250308.c(主函数、测试各个接口功能)

在这里插入图片描述

  • 实现接口
// 支持动态增长的栈
typedef int  STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
// 初始化栈
void STInit(ST* ps);
//销毁
void STDestroy(ST* ps);
// 入栈,插入
void STPush(ST* ps, STDataType x);
// 出栈,删除
void STPop(ST* ps);
//获取栈中有效元素个数
int STSize(ST* ps);
//检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool STEmpty(ST* ps);
//获取栈顶元素
STDataType STTop(ST* ps);

1.1.0 栈的初始化

在这里插入图片描述

// 初始化栈
void STInit(ST* ps)
{assert(ps);ps->a = (STDataType*)malloc(sizeof(STDataType)*4);if (ps->a == NULL){perror("STInit::malloc fail!");return;}ps->capacity = 4;ps->top = 0;//top是栈顶元素的下一个位置//ps->top =-1;//top是栈顶元素位置
}

1.1.1 销毁

//销毁
void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}

1.1.2 入栈

// 入栈,插入
void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){STDataType* tem = (STDataType*)realloc(ps->a,sizeof(STDataType) * ps->capacity*2);//扩容当前的2倍if (ps->a == NULL){perror("STInit::relloc fail!");return;}ps->a = tem;ps->capacity *= 2; //修改容量}ps->a[ps->top] = x;ps->top++;
}

1.1.3 出栈

// 出栈,删除
void STPop(ST* ps){assert(ps);assert(!STEmpty(ps));//检查是否为空,为空就报错,ps->top--;//直接--,但是空栈的时候就不能继续--,所以在之前进行是否为空的检查。
}

1.1.4 获取栈中有效元素个数

//获取栈中有效元素个数
int STSize(ST* ps)
{assert(ps);//top就是sizereturn ps->top;
}

1.1.5 检测栈是否为空,如果为空返回非零结果,如果不为空返回0

//检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

1.1.6 获取栈顶元素

//获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);return ps->a[ps->top - 1];//top是最后一个元素的下一个位置,所以-1
}

1.1.7 验证

  • 验证的时候,我们栈是不能打印的,我们需要一个一个出栈打印栈顶元素
void STTest()
{ST st;STInit(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);STPush(&st, 5);while (!STEmpty(&st)){printf("%d ", STTop(&st));STPop(&st);}STDestroy(&st);}

插入
在这里插入图片描述

删除
在这里插入图片描述

栈有效个数验证
在这里插入图片描述

附录 栈的C语言实现源码

.h文件

#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<assert.h>//静态的
//#define N 10
//typedef struct Stack
//{
//	int a[N];
//	int top;
//
//}Stack;// 支持动态增长的栈
typedef int  STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
// 初始化栈
void STInit(ST* ps);
//销毁
void STDestroy(ST* ps);
// 入栈,插入
void STPush(ST* ps, STDataType x);
// 出栈,删除
void STPop(ST* ps);
//获取栈中有效元素个数
int STSize(ST* ps);
//检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool STEmpty(ST* ps);
//获取栈顶元素
STDataType STTop(ST* ps);

.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"stack20250308.h"// 初始化栈
void STInit(ST* ps)
{assert(ps);ps->a = (STDataType*)malloc(sizeof(STDataType)*4);if (ps->a == NULL){perror("STInit::malloc fail!");return;}ps->capacity = 4;ps->top = 0;//top是栈顶元素的下一个位置//ps->top =-1;//top是栈顶元素位置
}//销毁
void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}
// 入栈,插入
void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){STDataType* tem = (STDataType*)realloc(ps->a,sizeof(STDataType) * ps->capacity*2);//扩容当前的2倍if (ps->a == NULL){perror("STInit::relloc fail!");return;}ps->a = tem;ps->capacity *= 2; //修改容量}ps->a[ps->top] = x;ps->top++;
}
// 出栈,删除
void STPop(ST* ps){assert(ps);assert(!STEmpty(ps));//检查是否为空,为空就报错,ps->top--;//直接--,但是空栈的时候就不能继续--,所以在之前进行是否为空的检查。
}//获取栈中有效元素个数
int STSize(ST* ps)
{assert(ps);//top就是sizereturn ps->top;
}
//检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}
//获取栈顶元素
STDataType STTop(ST* ps)
{assert(ps);return ps->a[ps->top - 1];//top是最后一个元素的下一个位置,所以-1
}

test.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"stack20250308.h"void STTest()
{ST st;STInit(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);STPush(&st, 5);STPop(&st);STPop(&st);int size = STSize(&st);printf("栈有效元素为:%d\n", size);while (!STEmpty(&st)){printf("%d ", STTop(&st));STPop(&st);}STDestroy(&st);
}int main()
{STTest();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算光学成像与光学计算概论

计算光学成像所涉及研究的内容非常广泛&#xff0c;虽然计算光学成像的研究内容是发散的&#xff0c;但目的都是一致的&#xff1a;如何让相机记录到客观实物更丰富的信息&#xff0c;延伸并扩展人眼的视觉感知。总的来说&#xff0c;计算光学成像现阶段已经取得了很多令人振奋…

什么样的物联网框架适合开展共享自助KTV唱歌项目?

现在物联网的广泛应用&#xff0c;也让更多用户们看到了它的实力&#xff0c;也使得共享经济遍地开花。其中共享自助唱歌设备也备受欢迎&#xff0c;那么适合开展共享自助KTV唱歌项目的物联网框架都应具备哪些特点呢&#xff1f; 智能化与自动化管理 物联网技术在共享KTV中的应…

机器视觉选型中,不同焦距的镜头成像视野有什么不同?

不同焦距的镜头成像视野的差异主要体现在视角范围和透视效果上。焦距越长&#xff0c;视角越窄&#xff0c;能捕捉的景物范围越小&#xff1b;焦距越短&#xff0c;视角越广&#xff0c;覆盖的景物范围越大。以下是具体分析&#xff1a; 焦距与视角的关系 焦距&#xff08;Foc…

Linux16-数据库、HTML

数据库&#xff1a; 数据存储&#xff1a; 变量、数组、链表-------------》内存 &#xff1a;程序运行结束、掉电数据丢失 文件 &#xff1a; 外存&#xff1a;程序运行结束、掉电数据不丢失 数据库&#xff1a; …

开源订货系统哪个好 三大订货系统源码推荐

在数字化转型加速的今天&#xff0c;企业对订货系统的需求日益增长。一款优质的订货系统源码不仅能提升供应链效率&#xff0c;还能通过二次开发满足个性化业务需求。这里结合 “标准化、易扩展” 两大核心要求&#xff0c;为您精选三款主流订货系统源码&#xff0c;助您快速搭…

行为模式---迭代器模式

概念 迭代器模式是设计模式的行为模式&#xff0c;它的主要设计思想是提供一个可以操作聚合对象&#xff08;容器或者复杂数据类型&#xff09;表示&#xff08;迭代器类&#xff09;。通过迭代器类去访问操作聚合对象可以隐藏内部表示&#xff0c;也可以使客户端可以统一处理…

Maven的学习以及安装配置 2024/3/1 idea

1. Maven的安装 1.1 首先查看编程工具合适的Maven版本 我使用的是2024/3/1 版本的idea&#xff0c;接下来我会用这个版本的idea进行演示。idea没有汉化的也可以参考我的步骤。 1、打开idea的设置&#xff0c;搜索Maven&#xff0c;进入Maven设置。 我们可以看到&#xff0c;…

基于 Docker 的跨平台镜像构建与增量更新实战指南

引言&#xff1a;破解容器化两大核心问题 在实际开发中&#xff0c;我们常常面临两个棘手问题&#xff1a; 跨平台兼容性&#xff1a;如何在Windows平台开发的镜像&#xff0c;无缝运行在 ARM64 服务器&#xff1f;更新效率低下&#xff1a;每次代码调整都要重新安装全部依赖…

支付通道开通对接一般需要多少钱

不少老板都想开通AIP线上接口&#xff0c;但是不知道这个成本到底是多少? 其实目前第三方支付公司对外提供了标准的线上接入技术方案&#xff0c;一般以API、SDK等形式。因此&#xff0c;商户在完成签约审核后&#xff0c;可以顺利拿到技术的密钥&#xff0c;正常调用第三方支…

什么是 spring 的循环依赖?

什么是 spring 的循环依赖&#xff1f; 首先&#xff0c;认识一下什么是循环依赖&#xff0c;举个例子&#xff1a;A 对象被 Spring 管理&#xff0c;并且引入的 B 对象&#xff0c;同样的 B 对象也被 Spring 管理&#xff0c;并且也引入的 A 对象。这种相互被引用的情况&#…

thrift软件、.thrif文件和thrift协议是什么关系,有什么用

Thrift软件、.thrift文件和Thrift协议是Apache Thrift框架的三个核心组成部分&#xff0c;它们协同实现跨语言服务的高效开发与通信。以下是三者关系及作用的详细解析&#xff1a; 一、核心组件关系 1. Thrift软件&#xff08;框架&#xff09; • 定位&#xff1a;Apache Th…

STM32旋转编码器驱动详解:方向判断、卡死处理与代码分析 | 零基础入门STM32第四十八步

主题内容教学目的/扩展视频旋转编码器电路原理&#xff0c;跳线设置&#xff0c;结构分析。驱动程序与调用。熟悉电路和驱动程序。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、旋转编码器原理与驱动结构1.1 旋转编码器工作原理1.2 驱动程序结构 二、方向判断…

elementplus的cascader级联选择器在懒加载且多选时的一些问题分析

1. 背景 在之前做的一个项目中使用到了element的级联选择器&#xff0c;并且是需要懒加载、多选、父子不关联等等&#xff0c;在选的时候当然没问题&#xff0c;但是回显的时候就会回显不出来&#xff0c;相信大部分伙伴都遇到过这个问题。我在以前出过一篇文章写过关于级联选…

【Python运维】用Python自动化AWS资源管理:利用boto3实现高效管理S3桶和EC2实例

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着云计算的普及,AWS(Amazon Web Services)已经成为许多企业和开发者首选的云平台。为了提高工作效率,自动化管理AWS资源成为了一个热…

淘宝关键字搜索接口爬虫测试实战指南

在电商数据分析和市场研究中&#xff0c;通过关键字搜索获取淘宝商品信息是一项重要任务。淘宝开放平台提供了 item_search 接口&#xff0c;允许开发者通过关键字搜索商品&#xff0c;并获取商品列表及相关信息。本文将详细介绍如何设计并测试一个基于该接口的爬虫程序&#x…

【Linux实践系列】:用c语言实现一个shell外壳程序

&#x1f525;本文专栏&#xff1a;Linux Linux实践项目 &#x1f338;博主主页&#xff1a;努力努力再努力wz 那么今天我们就要进入Linux的实践环节&#xff0c;那么我们之前学习了进程控制相关的几个知识点&#xff0c;比如进程的终止以及进程的等待和进程的替换&#xff0c;…

⭐算法OJ⭐N-皇后问题 II【回溯剪枝】(C++实现)N-Queens II

⭐算法OJ⭐N-皇后问题【回溯剪枝】&#xff08;C实现&#xff09;N-Queens 问题描述 The n-queens puzzle is the problem of placing n n n queens on an n n n \times n nn chessboard such that no two queens attack each other. Given an integer n, return the num…

03.06 QT

一、使用QSlider设计一个进度条&#xff0c;并让其通过线程自己动起来 程序代码&#xff1a; <1> Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QThread> #include "mythread.h"QT_BEGIN_NAMESPACE namespace Ui {…

Spring WebFlux 中 WebSocket 使用 DataBuffer 的注意事项

以下是修改后的完整文档&#xff0c;包含在多个多线程环境中使用 retain() 和 release() 方法的示例&#xff0c;且确保在 finally 块中调用 release()&#xff1a; 在 Spring WebFlux 中&#xff0c;WebSocketMessage 主要用于表示 WebSocket 的消息载体&#xff0c;其中 getP…

【CSS】Tailwind CSS 与传统 CSS:设计理念与使用场景对比

1. 开发方式 1.1 传统 CSS 手写 CSS&#xff1a;你需要手动编写 CSS 规则&#xff0c;定义类名、ID 或元素选择器&#xff0c;并为每个元素编写样式。 分离式开发&#xff1a;HTML 和 CSS 通常是分离的&#xff0c;HTML 中通过类名或 ID 引用 CSS 文件中的样式。 示例&#…