栈(数据结构)——C语言

1 概念与结构

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

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

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

栈的实现⼀般可以使⽤数组或者链表实现,相对⽽⾔数组的结构实现更优⼀些。因为在前链表中尾插需要遍历单链表,时间复杂度比数组尾插的时间复杂度高,数组在尾上插入数据的代价⽐较⼩,并且栈不存在从栈底直接取出,必须满足从栈顶取出,就不存在非空的头插,所以不论是出栈,入栈数组的时间复杂度都为o(1)。

2 栈的实现

和前面的数据结构实现一样,创建三个文件stack.h,stack.c,test.c,分别为头文件,函数实现文件,以及测试文件(检验实现的函数是否正确)。

stack.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int SDataType;typedef struct Stack
{SDataType* arr;int top;int capacity;
}ST;void StackInit(ST*ps);
void StackDestory(ST* ps);void StackPush(ST* ps, SDataType x);
void StackPop(ST* ps);SDataType StackTop(ST* ps);
int STSize(ST* ps);

这里很之前的一样,栈里存的元素。可以是各种数据类型,为了方便后续改成其他类型,这里重定义数据类型为SDataType,这里以int为例,Stack结构体里,包含数组,栈顶位置top,以及空间大小capacity。

初始化StackInit

void StackInit(ST*ps)
{assert(ps);ps->arr = NULL;ps->top = ps->capacity = 0;
}

断言传的指针非空,数组置为空,栈顶为置和空间大小都为0.

入栈StackPush

void StackPush(ST* ps, SDataType x)
{assert(ps);if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SDataType* tmp = (SDataType*)realloc(ps->arr,newcapacity * sizeof(SDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}ps->arr[ps->top] = x;ps->top++;
}

断言传的指针非空,首先要判断空间是否满了,或者空间大小为零,这里就需要申请空间,申请的大小每次为上一次的两倍,如果开始大小为零,则先申请4个大小的空间,然后对top栈顶位置的元素赋值x,最后top位置向后移动++。

判断栈为空StackEmpty

bool StackEmpty(ST*ps)
{assert(ps);return ps->top == 0;
}

这里利用bool类型返回,先断言传的指针非空,这里通过判断top位置是否为0,来判断栈是否为空。

出栈StackPop

void StackPop(ST* ps)
{assert(!StackEmpty(ps));ps->top--;
}

先判断栈是否为空,为空则不能出栈,这里直接将top位置向前移动一位,相当于合法访问的位置比原来的栈少了一个,即将栈顶元素拿出来了。

读取栈顶元素StackTop

SDataType StackTop(ST* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top-1];
}

先判断栈是否为空,为空则没有栈顶元素,这里直接通过数组下标访问,找到栈顶元素。

元素个数STSize

int STSize(ST* ps)
{assert(ps);return ps->top;
}

断言传的指针非空,直接返回Top位置,即为数组元素个数。

销毁栈StackDestory

void StackDestory(ST* ps)
{if (ps->arr != NULL){free(ps->arr);}ps->arr = NULL;ps->top = ps->capacity = 0;
}

先销毁数组中元素,不为空,就直接释放掉,置为空,栈顶位置和空间大小都置为0。

3.整体代码

Stack.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int SDataType;typedef struct Stack
{SDataType* arr;int top;int capacity;
}ST;void StackInit(ST*ps);
void StackDestory(ST* ps);void StackPush(ST* ps, SDataType x);
void StackPop(ST* ps);SDataType StackTop(ST* ps);
int STSize(ST* ps);

Stack.c

#include"Stack.h"
void StackInit(ST*ps)
{assert(ps);ps->arr = NULL;ps->top = ps->capacity = 0;
}void StackDestory(ST* ps)
{if (ps->arr != NULL){free(ps->arr);}ps->arr = NULL;ps->top = ps->capacity = 0;
}void StackPush(ST* ps, SDataType x)
{assert(ps);if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;SDataType* tmp = (SDataType*)realloc(ps->arr,newcapacity * sizeof(SDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newcapacity;}ps->arr[ps->top] = x;ps->top++;
}bool StackEmpty(ST*ps)
{assert(ps);return ps->top == 0;
}
void StackPop(ST* ps)
{assert(!StackEmpty(ps));ps->top--;
}SDataType StackTop(ST* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top-1];
}int STSize(ST* ps)
{assert(ps);return ps->top;
}

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

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

相关文章

如何动态改变本地的ip

在当今数字化时代&#xff0c;网络连接已成为我们日常生活和工作中不可或缺的一部分。无论是出于隐私保护、突破地域限制&#xff0c;还是为了测试和优化网络应用&#xff0c;动态改变本地IP地址的需求日益增多。本文将详细介绍如何安全、有效地实现这一目标&#xff0c;旨在帮…

Linux巡检利器xsos的安装和使用

一、 一般项目基本完成的时候&#xff0c;后期运维工作的重点就是及时的&#xff0c;合理的频率巡检了&#xff0c;巡检的目的主要是及时发现各种各样的问题 那么&#xff0c;自己编写shell脚本是大部分人的第一选择&#xff0c;这里有个比较麻烦的地方&#xff0c;shell脚本…

升级phpcmsV9系统的jquery版本引起的问题处理

前言&#xff1a; 如果jquery文件名修改了&#xff0c;/phpcms/modules/admin/templates/header.tpl.php文件中的jquery名称需要对应修改 一、后台输入框的验证问题 /statics/js/formvalidator.js文件调整为&#xff1a;点击下载 二、后台全选失效问题 1、/phpcms/modules/…

通过 Lighthouse 和 speed-measure-webpack 插件分析优化构建速度与体积

一、Lighthouse Lighthouse是 Google Chrome 推出的一款开源自动化工具&#xff0c;谷歌浏览器中已经集成&#xff0c;它可以搜集多个现代网页性能指标&#xff0c;分析 Web 应用的性能并生成报告&#xff0c;为开发人员进行性能优化的提供了参考方向。 Lighthouse会生成一份报…

Aatrox-Bert-VITS2部署指南

一、模型介绍 【AI 剑魔 ①】在线语音合成&#xff08;Bert-Vits2&#xff09;&#xff0c;将输入文字转化成暗裔剑魔亚托克斯音色的音频输出。 作者&#xff1a;Xz 乔希 https://space.bilibili.com/5859321 声音归属&#xff1a;Riot Games《英雄联盟》暗裔剑魔亚托克斯 …

分布式IO模拟量模块:多领域应用的高效能解决方案

分布式IO模拟量模块是分布式IO系统中的重要组件&#xff0c;用于实现现场设备或过程的模拟量信号的采集、监视和控制。该模块通常与现场总线耦合器配合使用&#xff0c;能够接收来自现场设备的模拟量信号&#xff08;如电流、电压等&#xff09;&#xff0c;并将其转换为数字信…

谷歌地图 | 与 Android 版导航 SDK 集成的最佳实践

谷歌最近宣布了导航 SDK&#xff0c;它可以让您将熟悉的 Google 地图逐向导航体验无缝集成到您的 Android 和 iOS 应用程序中。 这篇博文概述了一些最佳实践&#xff0c;您可以使用这些实践为您的 Android 应用程序使用导航 SDK 构建流畅、一致且可靠的导航体验。 与导航地图…

Linux系统安装软件的4种方式【源码配置编译安装、yum安装、rpm包安装、二进制软件包安装(.rpm/.tar.gz/.tgz/.bz2)】

一.源码安装 linux安装软件采用源码安装灵活自由&#xff0c;适用于不同的平台&#xff0c;维护也十分方便。 &#xff08;一&#xff09;源码安装流程  源码的安装一般由3个步骤组成&#xff1a; 1.配置&#xff08;configure&#xff09; Configure是一个可执行脚本…

5586 直播获奖(live)

经验值&#xff1a;1200 时间限制&#xff1a;1000毫秒 内存限制&#xff1a;256MB 全国2020CSP-J普及组试题 不许抄袭&#xff0c;一旦发现&#xff0c;直接清空经验&#xff01; 题目描述 Description NOI2130 即将举行。为了增加观赏性&#xff0c;CCF 决定逐一评出每个…

YOLOv11在目标检测中的应用及其与PaddleDetection的对比

近年来&#xff0c;目标检测模型在诸如自动驾驶、安全监控等应用中发挥了关键作用。众多模型中&#xff0c;YOLO&#xff08;You Only Look Once&#xff09; 系列凭借其在速度和精度之间的良好平衡脱颖而出。YOLOv11 作为该系列的最新版本之一&#xff0c;凭借其多项创新&…

Vue.js 入门教程

Vue.js 入门教程 一、引言 Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。与其他重量级框架不同&#xff0c;Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层&#xff0c;并且非常容易上手&#xff0c;同时也很容易与其他库或已有项目整合。本文将引导…

FPGA秋招必看基础 | FPGA设计流程

关注&#x1f446; 望森FPGA &#x1f446; 查看更多FPGA资讯 这是望森的第 30 期分享 作者 | 望森 来源 | 望森FPGA 目录 摘要 1 明确需求、设计系统架构 2 RTL 输入 3 功能仿真&#xff08;Behavioral Simulation&#xff09; 4 综合&#xff08;Synthesis&#xff09;…

Qgis 开发初级 《符号化》

本章主要简介Qgis 的矢量图层的符号化。Qgis的符号化具体作用于每个图层&#xff0c;图层通过具体的方法设置符号化样式。 1、QgsFeatureRenderer Qgs的符号化类主要是QgsFeatureRenderer&#xff0c;这是一个抽象类&#xff0c;它派生出了许多类&#xff0c;如下所示。常用的…

self-supervised learning(BERT和GPT)

1芝麻街与NLP模型 我們接下來要講的主題呢叫做Self-Supervised Learning&#xff0c;在講self-supervised learning之前呢&#xff0c;就不能不介紹一下芝麻街&#xff0c;為什麼呢因為不知道為什麼self-supervised learning的模型都是以芝麻街的人物命名。 因為Bert是一個非常…

使用Bert+BiLSTM+CRF训练 NER任务

使用的数据集在这里E-Commercial NER Dataset / 电商NER数据集_数据集-阿里云天池 针对面向电商的命名实体识别研究&#xff0c;我们通过爬取搜集了淘宝商品文本的标题&#xff0c;并标注了4大类&#xff0c;9小类的实体类别。具体类型及实体数量如下 针对面向电商的命名实体…

iptables防火墙总结

iptables防火墙总结 四表五链 P 默认策略&#xff0c;-p 协议 出口防火墙&#xff0c;默认配置&#xff0c;使用Forword&#xff0c;采用-P 例题&#xff1a;设置iptables防火墙默认不允许任何数据包进入&#xff0c;相应命令是&#xff1a; Iptables -t filter -P FORWORD -j…

undertow服务器初始化

springboot整合undertow服务器的源码从老生常谈的createWebServer方法谈起。spring会在生成所有bean后到创建web容器&#xff0c;此时会到容器找到ServletWebServerFactory接口bean&#xff0c;spring会根据引入的框架确定生成的ServletWebServerFactory&#xff0c;我们在mave…

【数据结构】五分钟自测主干知识(十一)

上回&#xff08;半年前&#xff09;我们讲了二叉树&#xff0c;如果我们要找到二叉树某序遍历下的前驱和后继&#xff0c;我们需要对其作动态遍历求得&#xff0c;比较费时&#xff1b;或者给每个结点增加两个指针域prior和next&#xff0c;但比较费空间。 有没有既能省时间&…

docker部署SQL审核平台Archery

1、概述 Archery 是一个开源的 SQL 审核平台,专为数据库的 SQL 运维和管理而设计,广泛应用于企业的数据库运维工作中。其主要功能是帮助数据库管理员和开发人员实现 SQL 审核、SQL 执行、在线执行、查询、工单管理、权限控制等数据库管理相关的操作。 Archery 的主要功能包括…

网络地址转换——NAT技术详解

网络地址转换——NAT技术详解 一、引言 随着互联网的飞速发展&#xff0c;IP地址资源日益紧张。为了解决IP地址资源短缺的问题&#xff0c;NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;技术应运而生。NAT技术允许一个私有IP地址的网络通…