栈的概念以及实现

目录:

一、栈的概念

二、栈的实现

1.栈的初始化

2.栈的销毁

3.入栈

4.出栈

5.获取栈顶数据

6.判断栈是否为空

7.获取栈的个数

三、代码

一、栈的概念

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。
进行数据插入和删除操作的一端
称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
例:比如手枪弹夹,先压进去的子弹往往是后发射出去,也就是遵循后进先出的原则。
首先来创建一个结构体,我们是基于数组实现的栈,一个栈首先要有数组存放数据,给一个top表示个数,给一个capacity表示空间大小:
typedef int stacktype;
typedef struct Stack
{stacktype* a;//动态数组int top;    //个数int capacity;//空间
}ST;

二、栈的实现

1.栈的初始化

一开始,数组为空,并且top和capacity都为0,这里的top有两种初始化方法,如果我们想让他指向栈中的最后一个数据,那么它的值就不能是数组的起始下标0,而应该给一个无关的数,比如-1;第二种就是top表示栈顶数据的下一个位置,那我们就可以给他赋值0,这里我们使用第二种方法:

void STInit(ST* pst)//初始化
{assert(pst);pst->a = NULL;pst->top = 0;//基于size指向的是栈顶数据的下一个位置pst->capacity = 0;
}

2.栈的销毁

删除也是很简单,原理和顺序表都差不多:

void STDestroy(ST* pst)//销毁
{assert(pst);free(pst->a);//free掉pst->a = NULL;//置为空,防止变成野指针pst->top = 0;pst->capacity = 0;
}

3.入栈

首先要明白,栈是栈顶入,栈顶出,所以所有数据都从栈顶进入,也就是top的位置,随后top++就可以,扩容和顺序表一样,详情可以参考:https://blog.csdn.net/xpcxpt/article/details/147466492?spm=1001.2014.3001.5501

总体代码如下:

void STPush(ST* pst, stacktype x)//插入 入栈
{assert(pst);//扩容if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;stacktype* tmp = (stacktype*)realloc(pst->a, newcapacity * sizeof(stacktype));if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;
}

4.出栈

出栈也就是删除一个栈顶的数据,那只需要让top--就可以了:

void STPop(ST* pst)//删除 出栈
{assert(pst);assert(pst->top > 0);//top是非负数pst->top--;//删除一个
}

5.获取栈顶数据

top的位置的栈顶数据的下一个位置,所以要想获取栈顶元素,就要获取top-1位置的元素:

stacktype STTop(ST* pst)//获取栈顶数据
{assert(pst);assert(pst->top > 0);return pst->a[pst->top - 1];
}

6.判断栈是否为空

直接判断栈中数据数量top是否为空,这里可以使用bool类型,不为空返回true,为空返回fulse:
 

bool STEmpty(ST* pst)//判断栈是否为空
{assert(pst);return pst->top == 0;
}

7.获取栈的个数

这里也是非常简单,就是获取top的大小,几行代码就搞定了:

int STSize(ST* pst)//判断栈的数据个数
{assert(pst);return pst->top;//从0开始的,所以返回size的大小-1,也就是下表从0-top-1,一共top个
}

三、代码

总体代码如下:

test.c:

#include "stack.h"int main()
{ST s;STInit(&s);STPush(&s, 1);STPush(&s, 2);//printf("%d ", STTop(&s));STPush(&s, 3);STPush(&s, 4);while (!STEmpty(&s)){printf("%d ", STTop(&s));STPop(&s);}STDestroy(&s);
}

stack.h:
 

#pragma once#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int stacktype;
typedef struct Stack
{stacktype* a;//动态数组int top;    //个数int capacity;//空间
}ST;void STInit(ST* pst);//初始化
void STDestroy(ST* pst);//销毁
void STPush(ST* pst, stacktype x);//插入 入栈
void STPop(ST* pst);//删除 出栈
stacktype STTop(ST* pst);//获取栈顶数据
bool STEmpty(ST* pst);//判断栈是否为空
int STSize(ST* pst);//判断栈的数据个数

stack.c:
 

#include "stack.h"void STInit(ST* pst)//初始化
{assert(pst);pst->a = NULL;pst->top = 0;//基于size指向的是栈顶数据的下一个位置pst->capacity = 0;
}void STDestroy(ST* pst)//销毁
{assert(pst);free(pst->a);//free掉pst->a = NULL;//置为空,防止变成野指针pst->top = 0;pst->capacity = 0;
}void STPush(ST* pst, stacktype x)//插入 入栈
{assert(pst);//扩容if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;stacktype* tmp = (stacktype*)realloc(pst->a, newcapacity * sizeof(stacktype));if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;
}
void STPop(ST* pst)//删除 出栈
{assert(pst);assert(pst->top > 0);//top是非负数pst->top--;//删除一个
}
stacktype STTop(ST* pst)//获取栈顶数据
{assert(pst);assert(pst->top > 0);return pst->a[pst->top - 1];
}
bool STEmpty(ST* pst)//判断栈是否为空
{assert(pst);return pst->top == 0;
}
int STSize(ST* pst)//判断栈的数据个数
{assert(pst);return pst->top;//从0开始的,所以返回size的大小-1,也就是下表从0-top-1,一共top个
}

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

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

相关文章

【Bluedroid】蓝牙启动之 SMP_Init 源码解析

蓝牙(安全管理协议,Security Management Protocol)是蓝牙设备安全通信的核心协议,负责配对、密钥协商和安全等级管理。本文围绕 Bluedroid SMP 协议的初始化流程展开,系统解析其核心控制块(tSMP_CB)的状态管理、与 L2CAP 层的接口注册,以及 P-256 椭圆曲线参数的初始化…

C++课设:考勤记录系统

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《编程项目实战》 目录 一、项目背景与需求分析1. 传统考勤管理…

前端面试题之ES6保姆级教程

ES6 核心特性深度解析&#xff1a;现代 JavaScript 开发基石 2015 年发布的 ECMAScript 2015&#xff08;ES6&#xff09;彻底改变了 JavaScript 的编程范式&#xff0c;本文将全面剖析其核心特性及最佳实践 一、ES6 简介与背景 ECMAScript 6.0&#xff08;简称 ES6&#xff0…

CTF:网络安全的实战演练场

文章目录 每日一句正能量前言一、CTF简介&#xff08;一&#xff09;什么是CTF&#xff1f;&#xff08;二&#xff09;CTF的历史 二、CTF比赛形式&#xff08;一&#xff09;线上赛&#xff08;Online CTF&#xff09;&#xff08;二&#xff09;线下赛&#xff08;Offline CT…

如何自定义一个 Spring Boot Starter?

导语&#xff1a; 在后端 Java 面试中&#xff0c;Spring Boot 是绕不开的重点&#xff0c;而“如何自定义一个 Starter”作为进阶开发能力的体现&#xff0c;常被面试官用于考察候选人的工程架构思维与 Spring Boot 底层掌握程度。本文将带你深入理解自定义 Starter 的实现逻辑…

大学课程:计算机科学与技术专业主要课程,是否落伍了?

计算机科学与技术 计算机科学与技术&#xff08;CS&#xff09;是一门涵盖理论、系统、应用的综合学科&#xff0c;其课程体系围绕“计算机的底层原理、开发方法、技术创新”展开&#xff0c;既包含数学与理论基础&#xff0c;也涉及工程实践与前沿技术。以下是主要课程的分类…

docker-部署Nginx以及Tomcat

一、docker 部署Nginx 1、搜索镜像&#xff08;nginx&#xff09; [rootlocalhost /]# docker search nginx Error response from daemon: Get "https://index.docker.io/v1/search?qnginx&n25": dial tcp 192.133.77.133:443: connect: connection refused 简…

服务器信任质询

NSURLSession 与 NSURLAuthenticationMethodServerTrust —— 从零开始的“服务器信任质询”全流程 目标读者&#xff1a;刚接触 iOS 网络开发、准备理解 HTTPS 与证书校验细节的同学 出发点&#xff1a;搞清楚为什么会有“质询”、质询的触发时机、以及在 delegate 里怎么正确…

MCP协议重构AI Agent生态:万能插槽如何终结工具孤岛?

前言 在人工智能技术快速发展的2025年&#xff0c;MCP(Model Context Protocol&#xff0c;模型上下文协议)正逐渐成为AI Agent生态系统的关键基础设施。这一由Anthropic主导的开放协议&#xff0c;旨在解决AI模型与外部工具和数据源之间的连接难题&#xff0c;被业界形象地称…

测试 FreeSWITCH 的 mod_loopback

bgapi originate loopback/answer,park/default/inline park inline show channels as xml show calls as xml 有 2 个 channels 有 2 个 calls 比较有意思 在 loopback-a 是播放 wav 在 loopback-b 上可以录音 这就是回环 有什么用呢&#xff1f; 除了做测试&#x…

三维GIS开发cesium智慧地铁教程(4)城市白模加载与样式控制

一、添加3D瓦片 <!-- 核心依赖引入 --> <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"><!-- 模型数据路径 --> u…

Unity 中的颜色空间

一、颜色空间基本概念疑问 1、什么是颜色空间&#xff1f; 颜色空间是一个数学模型或系统&#xff0c;它定义了一套规则和方法&#xff0c;用来精确地描述、表示和组织颜色。​ 可以把它想象成一个三维坐标系​&#xff08;或者有时更多维&#xff09; 每个维度代表一…

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…

Python----目标检测(YOLO简介)

一、 YOLO简介 [YOLO](You Only Look Once&#xff09;是一种流行的物体检测和图像分割模型&#xff0c; 由华盛顿大学的约瑟夫-雷德蒙&#xff08;Joseph Redmon&#xff09;和阿里-法哈迪&#xff08;Ali Farhadi&#xff09;开发&#xff0c;YOLO 于 2015 年推出&#xff0c…

OLED(SSD306)移植全解-基于IIC

OLED&#xff08;SSD306&#xff09;移植全解-基于IIC 一&#xff0c;什么是oled?二&#xff0c;什么是IIC协议三&#xff0c;IIC通信流程&#xff1a;四&#xff0c;针对SSD1306的IIC通信流程&#xff08;结合芯片手册版&#xff09;1&#xff0c;主机发送起始信号2&#xff…

LangChain【7】之工具创建和错误处理策略

文章目录 一 LangChain 自定义工具概述二创建自定义工具的三种方法2.1 方法一&#xff1a;tool 装饰器2.1.1 同步方法案例2.1.2 工具描述方式1&#xff1a;传参2.1.3 工具描述方式2&#xff1a;文档字符串 2.2 方法二&#xff1a;StructuredTool类2.2.1 StructuredTool创建自定…

【信息系统项目管理师-选择真题】2025上半年(第二批)综合知识答案和详解(回忆版)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…

「EN 18031」访问控制机制(ACM - 1):智能路由器的安全守卫

家用路由器要是出口欧洲&#xff0c;可得留意欧盟EN18031标准里的访问控制机制。以路由器为例&#xff0c;访问控制机制&#xff08;ACM&#xff09;能决定谁能连入网络、访问哪些网站。比如通过设置不同的用户角色和权限&#xff0c;家长可以限制孩子设备的上网时间和可访问的…

关于项目多语言化任务的概述

今天的任务一个是关于多语言化的&#xff0c;也就是i18n&#xff0c;我需要做的呢首先是知道项目多语言是怎么实现的&#xff0c;一般情况下没有多语言化这个功能的时候&#xff0c;我们会写一个页面&#xff0c;默认是英文&#xff0c;然后里面的文本都是英文&#xff0c;那么…

护网行动面试试题(2)

文章目录 51、常见的安全工具有哪些&#xff1f;52、说说Nmap工具的使用&#xff1f;53、近几年HW常见漏洞有哪些&#xff1f;54、HW 三&#xff08;四&#xff09;大洞56、获得文件读取漏洞&#xff0c;通常会读哪些文件57、了解过反序列化漏洞吗&#xff1f;58、常见的框架漏…