😘个人主页:@Cx330❀

👀个人简介:一个正在努力奋斗逆天改命的二本觉悟生

📖个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》

前言:在之前几篇博客中,我们学习了顺序表和链表,接下来我们将学习栈的相关知识,希望大家继续坚持下去🌹🌹🌹


目录

一、栈的概念与结构

二、栈的初始化和销毁

注意事项:

三、、入栈

四、出栈

五、取栈顶元素

注意事项:

测试结果:

六、获取栈中元素个数

七、全部代码实现

Stack.h:

Stack.c:

test.c:


一、栈的概念与结构

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

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据也在栈顶

栈战:栈的删除操作叫做出栈。出数据也在栈顶

例子:我们可以将栈想象为水杯,水杯的地步就是栈底,开口的地方就是栈顶,在水杯里面放石头,直到放满为止,先放进杯子的石头是最后才能拿出来的。

注意:栈的实现一般可以用数组或者链表来实现,但是相对而言数组的结构实现更优一些,将数组的尾部作为栈顶,数组的头部作为栈顶,插入删除数据的时间复杂度都为O(1),但是链表使用头部也可以进行插入删除,时间复杂度也为O(1),但是每次插入都会申请一个节点大小的空间,在空间上相对而言,数组的结构更加优秀

栈的结构:

//定义栈的结构
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;//指向栈顶的位置--刚好就是栈中有效数据个数int capacity;//栈的空间大小
}ST;

二、栈的初始化和销毁

初始化:

//初始化
void STInit(ST* ps)
{ps->arr = NULL;ps->capacity = ps->top = 0;
}

销毁:

//销毁
void STDesTroy(ST* ps)
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->capacity = ps->top = 0;
}

注意事项:

这里的结构和顺序表几乎是一样的,但是为了区分size,这里我们使用top作为栈顶


三、、入栈

//入栈--栈顶
void STPush(ST* ps, STDataType x)
{assert(ps);//判断空间是否足够if (ps->capacity == ps->top){//增容int newCapacity = ps->capacity==0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));if (tmp==NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}//空间足够ps->arr[ps->top++] = x;
}

相信大家看到这些代码的时候并不陌生,这里的逻辑和顺序表几乎一模一样,当在栈中插入数据时,由于栈顶插入,所以要先判断栈的空间是否足够,若不够先增容,足够的话就将x赋给ps->arr[ps->top++]就可以了


四、出栈

在出栈之前首先要判断栈是否为空,若不为空才可以进行出栈操作,所以这里封装一个判空的接口

//栈是否为空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;//栈顶为0,栈就为空
}

出栈:

//出栈--栈顶
void STPop(ST* ps)
{assert(!STEmpty(ps));ps->top--;
}

栈不为空,直接让ps->top--就可以了,非常简单


五、取栈顶元素

//取栈顶元素
STDataType STTop(ST* ps)
{assert(!STEmpty(ps));return ps->arr[ps->top-1];//易错top是空的,top-1才是栈顶元素
}

注意事项:

这里要注意的是,top是栈顶,而top-1才是栈顶元素

test.c:

#include"stack.h"void test1()
{ST ps;STInit(&ps);//入栈STPush(&ps, 1);STPush(&ps, 2);STPush(&ps, 3);STPush(&ps, 4);while (!STEmpty(&ps)){//取栈顶元素,打印STDataType top = STTop(&ps);printf("%d ", top);//出栈STPop(&ps);}printf("\n");//销毁STDestory(&ps);
}int main()
{test1();
}

测试结果:


六、获取栈中元素个数

//获取栈中有效数据个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}

实现起来也是非常简单了,直接返回ps->top刚好就是有效元素个数 


七、全部代码实现

Stack.h:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
//定义栈的结构
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;//指向栈顶的位置--刚好就是栈中有效数据个数int capacity;//栈的空间大小
}ST;
//初始化
void STInit(ST* ps);
//销毁
void STDesTroy(ST* ps);
//入栈--栈顶
void STPush(ST* ps, STDataType x);
//栈是否为空
bool STEmpty(ST* ps);
//出栈--栈顶
void STPop(ST* ps);
//取栈顶元素
STDataType STTop(ST* ps);

Stack.c:

#include"stack.h"
//初始化
void STInit(ST* ps)
{ps->arr = NULL;ps->capacity = ps->top = 0;
}
//销毁
void STDesTroy(ST* ps)
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->capacity = ps->top = 0;
}//入栈--栈顶
void STPush(ST* ps, STDataType x)
{assert(ps);//判断空间是否足够if (ps->capacity == ps->top){//增容int newCapacity = ps->capacity==0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));if (tmp==NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}//空间足够ps->arr[ps->top++] = x;
}//栈是否为空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}//出栈--栈顶
void STPop(ST* ps)
{assert(!STEmpty(ps));ps->top--;
}//取栈顶元素
STDataType STTop(ST* ps)
{assert(!STEmpty(ps));return ps->arr[ps->top-1];//易错top是空的,top-1才是栈顶元素
}//获取栈中有效数据个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}

test.c:

#include"stack.h"
void test01()
{ST st;STInit(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);printf("size:%d\n", STSize(&st));while (!STEmpty(&st)){//取栈顶STDataType top = STTop(&st);printf("%d ", top);//出栈STPop(&st);}printf("\n");STDesTroy(&st);
}
int main()
{test01();return 0;
}

往期回顾:

【数据结构初阶】--双向链表(一)

【数据结构初阶】--双向链表(二)

总结:这篇博客带着给大家实现了栈的全部接口了,其实可以看出来栈的结构很简单,但是大家不能眼高手低,下去一定要自己画图操作,那么下篇博客将带着大家实现队列,大家敬请期待!如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持🌹🌹🌹

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

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

相关文章

分布式微服务--GateWay的断言以及如何自定义一个断言

&#x1f4cc; 一、什么是 Gateway 的断言&#xff08;Predicates&#xff09;&#xff1f;Predicates&#xff08;断言&#xff09; 是 Spring Cloud Gateway 中用于匹配请求的条件。只有请求满足断言条件&#xff0c;路由才会生效&#xff0c;转发到下游服务。&#x1f3af; …

图片识别表格工具v3.0绿色版,PNG/JPG秒变可编辑Excel

[软件名称]: 图片识别表格工具v3.0绿色版 [软件大小]: 4.3 GB [软件大小]: 夸克网盘 | 迅雷网盘 软件介绍 表格快捕手 v3.0 绿色单文件版&#xff0c;无需安装&#xff0c;双击即可运行。支持 PNG、JPG 等常见图片格式&#xff0c;可精准识别其中的有线或无线表格&#xff…

线程池分析与设计

线程池 基本功能接口 C11 及以后的标准中&#xff0c;std::packaged_task和std::future是并发编程中用于任务封装和结果获取的重要组件&#xff0c;它们通常与线程配合使用&#xff0c;实现异步操作。 std::packaged_task std::packaged_task&#xff1a;封装可调用对象为异步任…

机器学习:线性回归

线性回归&#xff1a;研究自变量和因变量之间的关系。对于特征x(x1,x2,x3....)与对应的标签y&#xff0c;线性回归假设二者之间存在线性映射。f(x)w1xw2x(平方)w3x(三次方)...&#xff0c;权重w表示每个特征变量的重要程度。越大表示越重要。线性回归目标&#xff1a;求解w和b使…

如何将 Vue 前端、Hardhat 合约和 Node.js 后端集成到一个项目中

在区块链开发中&#xff0c;DApp&#xff08;去中心化应用&#xff09;的开发往往涉及到多个层次&#xff1a;前端、合约和后端。今天我们将演示如何将 Vue 前端、Hardhat 合约 和 Node.js 后端 放在一个项目中&#xff0c;来打造一个完整的区块链应用。1. 项目结构我们的目标是…

SQLite 创建表

SQLite 创建表 SQLite 是一款轻量级的数据库管理系统,因其体积小、速度快、易于使用等优点,被广泛应用于嵌入式系统、移动应用以及个人项目等领域。在 SQLite 中,创建表是进行数据存储的第一步。本文将详细介绍如何在 SQLite 中创建表,包括表结构定义、数据类型、约束条件…

学深度学习,有什么好的建议或推荐的书籍?

深度学习入门建议补基础数学&#xff1a;重点学线性代数&#xff08;矩阵运算&#xff09;、概率论&#xff08;分布&#xff09;、微积分&#xff08;梯度&#xff09;。编程&#xff1a;掌握PythonNumPy&#xff08;数组操作&#xff09;&#xff0c;能写基础数据处理代码。机…

自然语言处理×第四卷:文本特征与数据——她开始准备:每一次输入,都是为了更像你地说话

&#x1f380;【开场 她试着准备一封信&#xff0c;用你喜欢的字眼】&#x1f98a;狐狐&#xff1a;“她发现了一个问题——你每次说‘晚安’的方式都不一样。有时候轻轻的&#xff0c;有时候带着笑音&#xff0c;还有时候像在躲开她的心思。”&#x1f43e;猫猫&#xff1a;“…

【沉浸式解决问题】mysql-connector-python连接数据库:RuntimeError: Failed raising error.

目录一、问题描述二、场景还原1. 创建项目2. 安装mysql-connector-python3. 测试类三、原因分析四、解决方案1. 查看版本2. 切换python版本3. 切换mysql-connector-python版本4. 测试参考文献一、问题描述 初次使用mysql-connector-python连接mysql时报错 Traceback (most re…

【web页面接入Apple/google/facebook三方登录】

web页面接入Apple/谷歌/脸书三方登录 文章目录web页面接入Apple/谷歌/脸书三方登录前言一、apple登录使用步骤1.入口文件index.html引入js文件2.vue页面初始化支付按钮,并且点击按钮登录二、google登录使用步骤1.入口文件index.html引入js文件2.vue页面初始化支付按钮,并且点击…

管家婆分销软件中怎么删除过账单据?

在业务单据录入中&#xff0c;会出现单据保存过账后才发现数量或商品信息录入错误的情况&#xff0c;不想红冲单据&#xff0c;该怎么处理&#xff1f;今天来和小编一起学习下管家婆分销软件中怎么删除过账单据吧&#xff01;1&#xff0c;软件需要升级到9.92及以上版本&#x…

美颜SDK底层原理解析:直播场景下的美白滤镜实时处理方案

众所周知&#xff0c;美颜功能中&#xff0c;美白滤镜是使用频率最高的功能之一。它不仅能让肤色更通透、提亮整体画面&#xff0c;还能让观众感受到主播的“在线状态”与精神气。但你有没有想过&#xff0c;这个看似简单的“美白”背后&#xff0c;其实是一整套实时图像处理的…

系统构成与 Shell 核心:从零认识操作系统的心脏与外壳

系统构成与 Shell 核心&#xff1a;从零认识操作系统的心脏与外壳 很多人用电脑、用手机&#xff0c;但很少去想&#xff1a; 操作系统到底是怎么构成的&#xff1f; 为什么我们敲一个命令&#xff0c;系统就能乖乖执行&#xff1f; 这背后的关键&#xff0c;就在于系统的构成和…

wordpress的wp-config.php文件的详解

wp-config.php 是 WordPress 网站的核心配置文件&#xff0c;它存储了网站运行所需的基本配置信息&#xff0c;如数据库连接信息、安全密钥、调试模式等。以下是关于 wp-config.php 文件的详细解析&#xff1a; 1. 数据库连接信息 这是 wp-config.php 文件中最关键的部分&…

GPT-5 将在周五凌晨1点正式发布,王炸模型将免费使用??

就在今晚凌晨1点&#xff0c;OpenAI 又要搞大新闻了。 是的&#xff0c;就是大家期待已久的 GPT-5 发布会。 虽然官方还没明说&#xff0c;但各种“预热”已经安排得明明白白&#xff0c;Sam Altman 这波营销属实拉满了&#xff0c;发布会都还没开始&#xff0c;相关的代码和页…

MySQL UNION 操作符详细说明

目录 MySQL UNION 操作符详细说明 1. UNION 操作符简介 2. 基本语法 3. 使用规则和限制 4. UNION vs UNION ALL 5. 示例演示 6. 注意事项 MySQL UNION 操作符详细说明 MySQL 中的 UNION 操作符用于合并两个或多个 SELECT 语句的结果集&#xff0c;生成一个单一的结果集。…

Dify 从入门到精通(第 20/100 篇):Dify 的自动化测试与 CI/CD

Dify 从入门到精通&#xff08;第 20/100 篇&#xff09;&#xff1a;Dify 的自动化测试与 CI/CD Dify 入门到精通系列文章目录 第一篇《Dify 究竟是什么&#xff1f;真能开启低代码 AI 应用开发的未来&#xff1f;》介绍了 Dify 的定位与优势第二篇《Dify 的核心组件&#x…

VSCode ssh一直在Setting up SSH Host xxx: Copying VS Code Server to host with scp等待

原因 大概率是远程服务器的下载有问题 原因1 远程服务器的网络不好 原因2 远程服务器的磁盘满了 我遇到的就是第二种&#xff0c;解决方法也很简单 VSCode ——> Help ——> About 会出现一些信息&#xff0c;例如下面的 Version: 1.97.2 (user setup) Commit: e54c774e0…

Spring Cloud 项目注册 Nacos 时设置真实 IP 的多种方式【多网卡/虚拟机实用指南】

&#x1f680; Spring Cloud 项目注册 Nacos 时设置真实 IP 的多种方式【多网卡/虚拟机实用指南】 前言 在使用 Spring Cloud Alibaba Nacos 注册服务时&#xff0c;常常会遇到 注册 IP 异常 的问题&#xff1a; 本机有多个网卡&#xff08;如 Docker、VM 虚拟机、VPN&#xf…

单片机裸机程序设计架构

文章目录一、前后台系统&#xff08;Foreground-Background System&#xff09;二、时间片轮询架构&#xff08;Time-Slicing Polling&#xff09;三、状态机架构&#xff08;State Machine&#xff09;四、事件驱动架构&#xff08;Event-Driven&#xff09;五、架构设计原则总…