c语言实现栈

前言

本文章主要介绍用c语言实现栈,包括栈的各个接口比如STInit,STpush,STpop等等

一.栈的概念及结构

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

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

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

入栈即加入数据到栈顶

出栈即将栈顶数据删除

二.栈实现的结构选择

1)选择数组来存储栈的数据还是链表来存储?

这涉及到顺序表和链表两种数据结构的特性。两个都能实现栈,但是根据栈最常用的操作是入栈和出栈,即尾删和尾插。而数组的尾删和尾插是优于链表的。因为链表的尾删还要获取尾结点要涉及找尾操作,不像数组可以通过下标直接访问到尾部的空间。

更加详细对比请看这篇文章

顺序表和链表的区别-CSDN博客

先看下要实现的接口函数有哪些,然后相关的头文件也一并列出了。我们用多文件编写这个栈的实现。stack.h放函数的声明,顺便把所有要用的头文件都在这个文件引用。这样在其他文件只要引用一个stack.h文件即可。

stack.c放函数的实现。stack.c放函数的测试(放main函数)。

stack.h文件


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int STDataType;
//创建动态栈,栈的核心是对栈顶的操作,所以创建结构体包含栈顶下标top,便于管理栈顶
typedef struct STDataType
{STDataType* a;  //使用顺序表来当栈int top;        // 栈的最后一位有效元素的后一位的下标 数值上等于栈的所有有效元素数量//比如top初始化为0,则有效元素数为0个,且是‘最后一位有效元素’的后一位下标。//即在此下标对应的空间赋值,就是入栈int capacity;   //栈的容量大小(顺序表)
}ST;//初始化栈   -- 注意,每一个接口函数的参数都要有一级指针,因为这样才能实际改变栈。否则就只是实参的拷贝,出函数后就会销毁。
void STInit(ST* ps);//压栈
void STpush(ST* ps, STDataType x);//出栈
void STpop(ST* ps);//释放malloc开辟空间
void STDestroy(ST* ps);//拿到栈顶元素
STDataType STtop(ST* ps);//拿到栈的有效元素个数
int Stsize(ST* ps);//检查栈是否为空
bool STEmpty(ST* ps);

stack.c --- 函数的实现


 


#include "stack.h"void STInit(ST* ps)
{assert(ps);  //断言 ,ps指针不能为空ps->a = NULL;ps->capacity = 0;ps->top = 0;
}void STpush(ST* ps, STDataType x)
{assert(ps);
//栈顶到容量顶就扩容if (ps->top == ps->capacity){
//这里用三目运算符是为了应对一开始栈为空的情况,对容量*2并不能实现扩容int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
//直接用realloc,当ps->a中是空时,realloc的功能和malloc一样STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);//checkif (tmp == NULL){perror("realloc fail");exit(-1);}//refresh更新ps->capacity = newcapacity;ps->a = tmp;}//push ps->a[ps->top] = x;// initialize  a  = 0  a就是最后有效元素的后一位下标(其对应位置为空)ps->top++;
}//出栈 只要删减top即可
void STpop(ST* ps)
{assert(ps);assert(ps->top>0);--ps->top;
}void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->capacity = 0;ps->top = 0;}STDataType STtop(ST* ps)
{assert(ps);//NULL  top = 0 无意义,栈顶没有元素可取assert(ps->top > 0);return ps->a[ps->top - 1]; //如我们一开始初始化时一样,top所指下标是最后一个有效元素的下一个
}//栈的最后一位有效元素的后一位的下标 数值上等于栈的所有有效元素数量
int Stsize(ST* ps)
{assert(ps);return ps->top;
}//判断栈是否为空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;  //为0时表示为空,返回true ,否则返回false
}

test.c--主函数的控制

#include "stack.h"int main()
{ST st1;STInit(&st1);STpush(&st1, 1);STpush(&st1, 2);STpush(&st1, 3);STpush(&st1, 4);STpush(&st1, 5);
//栈的打印,打印栈顶元素后出栈,删除栈顶元素以取得下一个栈顶元素。
//实际应用场景也是如此,使用完的栈顶元素就不要了。while (!STEmpty(&st1)){printf("%d ", STtop(&st1));STpop(&st1);}printf("\n");//不要忘了释放malloc出来的空间STDestroy(&st1);return 0;
}

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

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

相关文章

华为配置Smart Link主备备份示例

定义 Smart Link&#xff0c;又叫做备份链路。一个Smart Link由两个接口组成&#xff0c;其中一个接口作为另一个的备份。Smart Link常用于双上行组网&#xff0c;提供可靠高效的备份和快速的切换机制。 Monitor Link是一种接口联动方案&#xff0c;它通过监控设备的上行接口…

1、关于前端js-ajax绕过

1、Ajax知识 、js--Ajax 传统请求跟js--Ajax请求的差别 在实例中用的上js-ajax的有 表单验证&#xff1a; 在用户填写表单时&#xff0c;可以使用 Ajax 在不刷新页面的情况下验证表单字段&#xff0c;并提供即时反馈。 实时搜索&#xff1a; 在搜索框中输入内容时&#xff0…

Vue3使用Tailwind CSS

安装 Tailwind 以及其它依赖项 npm install -D tailwindcsslatest postcsslatest autoprefixerlatest生成配置文件&#xff1a; npx tailwindcss init -p.修改配置文件 tailwind.config.js 2.6版本 &#xff1a; module.exports {purge: [./index.html, ./src/**/*.{vue,j…

javaEE -14(10000字 JavaScript入门 - 1)

一&#xff1a;初始 JavaScript JavaScript (简称 JS)是世界上最流行的编程语言之一&#xff0c;它是一个脚本语言, 通过解释器运&#xff0c;主要在客户端(浏览器)上运行, 现在也可以基于 node.js 在服务器端运行. JavaScript 和 HTML 和 CSS 之间的关系&#xff1a; HTML…

溯源取证-WEB流量分析-简单

话不多说直接干&#xff1a; 题干&#xff1a; 开发团队在公司的一个 Web 服务器上发现了异常文件&#xff0c;开发团队怀疑该服务器上存在潜在的恶意活动&#xff0c;网络团队准备了一个包含关键网络流量的 pcap 文件&#xff0c;供安全团队分析&#xff0c;而你的任务是分析…

通过静态HTTP实现负载均衡

在当今的互联网环境中&#xff0c;随着用户数量的不断增加和业务需求的不断扩大&#xff0c;单台服务器往往无法承受所有的访问压力。为了确保网站的可用性和性能&#xff0c;负载均衡成为了一种常见的解决方案。本文将探讨如何通过静态HTTP实现负载均衡&#xff0c;以提升网站…

力扣题:公共前缀/单词-11.18

力扣题-11.18 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;14.最长公共前缀 解题思想&#xff1a;先找到最小的字符串长度&#xff0c;然后进行字符串的遍历即可 class Solution(object):def longestCommonPrefix(self, strs):""&qu…

腾讯云CentOS8 jenkins war安装jenkins步骤文档

腾讯云CentOS8 jenkins war安装jenkins步骤文档 一、安装jdk 1.1 上传jdk-11.0.20_linux-x64_bin.tar.gz 1.2 解压jdk安装包文件 tar -zxvf jdk*.tar.gz 1.3 在/usr/local 目录下创建java目录 cd /usr/local mkdir java 1.4 切到java目录&#xff0c;把jdk解压文件改名为jd…

枚举类的final修饰

今天开发跟我反馈了一个很奇怪的问题&#xff0c;说有个对象的状态属性是枚举类&#xff0c;设置了该对象的状态后&#xff0c;插入数据库&#xff0c;这个状态没了&#xff0c;凭空消失了&#xff0c;变成了空白字符串。这让人感觉非常奇怪&#xff0c;整个问题排查后得到的结…

数据分析基础之《matplotlib(5)—直方图》

一、直方图介绍 1、什么是直方图 直方图&#xff0c;形状类似柱状图却有着与柱状图完全不同的含义。直方图牵涉统计学的概念&#xff0c;首先要对数据进行分组&#xff0c;然后统计每个分组内数据元的数量。在坐标系中&#xff0c;横轴标出每个组的端点&#xff0c;纵轴表示频…

持续集成交付CICD:使用Maven命令下载Nexus制品

目录 一、实验 1.Maven安装 2.Nexus搭建公共组仓库及Maven全局配置文件 3.使用Maven命令下载Nexus制品 一、实验 1.Maven安装 &#xff08;1&#xff09;CentOS环境安装步骤 tar -xf apache-maven-3.8.6-bin.tar.gz #解压 mv apache-maven-3.8.6 /usr/local/maven #移动…

文献计量学方法与应用、主题确定、检索与数据采集、VOSviewer可视化绘图、Citespace可视化绘图、R语言文献计量学绘图分析

目录 一、文献计量学方法与应用简介 二、主题确定、检索与数据采集 三、VOSviewer可视化绘图 四、Citespace可视化绘图 五、R语言文献计量学绘图分析 六、论文写作 七、论文投稿 更多应用 文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉…

Linux--学习记录(1)

CtrlAltT:打开终端 各个文件的含义&#xff1a; cmd [-options] [parameter]:中括号为可选的&#xff0c;<>内必须填写 如何设置PATH&#xff1a; 1、临时设置&#xff0c;在命令行中输入&#xff1a;export PATH$PATH:/home/wangxianyue/桌面&#xff0c;其中:/home/wa…

Navicat 技术指引 | 适用于 GaussDB 分布式的模型功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

使用Microsoft Dynamics AX 2012 - 5. 生产控制

生产控制的主要职责是生产成品。为了完成这项任务&#xff0c;制造业需要消耗物品和资源能力&#xff08;人员和机械&#xff09;。制造过程可能包括半成品的生产和库存。半成品是指物品包括在成品材料清单中。 制造业的业务流程 根据公司的要求&#xff0c;您可以选择申请Dy…

聚观早报 |华为畅享 70正式开售;梦饷科技双12玩法

【聚观365】12月8日消息 华为畅享 70正式开售 梦饷科技双12玩法 华为Mate X5应对火海挑战 谷歌发布AI模型Gemini 字节跳动开启新一轮回购 华为畅享 70正式开售 精致外观与创新科技兼具的华为畅享 70正式开售&#xff0c;1199元起搭载6000mAh超大电池&#xff0c;带来超强…

C/C++端口复用SO_REUSEADDR(setsockopt参数),test ok

端口复用最常用的用途应该是防止服务器重启时之前绑定的端口还未释放或者程序突然退出而系统没有释放端口。这种情况下如果设定了端口复用&#xff0c;则新启动的服务器进程可以直接绑定端口。如果没有设定端口复用&#xff0c;绑定会失败&#xff0c;提示ADDR已经在使用中——…

1-Maven基础

文章目录 Maven基础Maven相关概念构建依赖 Maven用途Maven的工作机制 Maven使用-1-Maven软件的解压与配置步骤1&#xff1a;下载步骤2&#xff1a;解压Maven核心程序步骤3&#xff1a;指定本地仓库步骤4&#xff1a;配置阿里云提供的镜像仓库步骤5&#xff1a;配置 Maven工程的…

【小白专用】MySQL入门(详细总结)

3. 创建数据库 使用 create database 数据库名; 创建数据库。 create database MyDB_one; create database DBAliTest; 创建数据库成功后&#xff0c;数据库的数量变成了6个&#xff0c;多了刚才创建的 dbalitest 。 4. 创建数据库时设置字符编码 使用 create database 数据…

sfp8472学习CDR

1,cdr名称解释 因为光信号传输至一定距离的时候,通常是长距离传输,其波形会出现一定程度的失真,接收端接收到的信号是一个个长短不一的脉冲信号,这个时候在接收端,我们就无法得到我们需要的数据。所以,这个时候就需要有信号的再生,信号的再生功能为再放大、再整形和再…