C数据结构:栈

简介

   在之前的几篇文章中已经详细讲解了线性表中的 顺序表、单链表。每一种不同的数据结构都有它独特的结构和应用之处,今天将再次给大家介绍一个新的线性表:

1. 栈:一种特殊的线性表,其中只允许在固定的一端进行插入和删除元素的操作。

2. 栈的原型:其中进行数据插入的和删除操作的一端称为栈顶,另一端称为栈底。

3. 栈的原则:栈中的数据元素遵守 后进先出(LIFO)的原则   

4. 栈的场景:在日常生活中,(电梯)就相当于一个栈,先进去的人后出,后进去的人总是先出   

🔑栈的两个经典操作:
压栈:栈的插入操作叫做 进栈 / 压栈  / 入栈  (入数据在栈顶)

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

顺序存储栈

顺序存储栈是栈的顺序实现。顺序栈是指利用顺序存储结构(数组)实现的栈。采用地址连续的存储空间依次存储栈中数据元素。

main.c

#include <stdlib.h>
#include <stdio.h>
#include "sqstack.h"int main()
{sqstack*st;st = st_create();if(st == NULL)exit(1);datatype arr[] = {11,22,33,44,55,66,77,88};for(int i=0;i<8;i++){st_push(st,&arr[i]);}datatype temp;st_travel(st);while(st_pop(st,&temp)==0){printf("POP %d \n",temp);}st_destroy(st);return 0;
}

sqstack.h

#ifndef SQSTACK_H
#define SQSTACK_H
#define MAXSIZE 5
typedef int datatype;typedef struct node_st
{datatype data[MAXSIZE];int top;
}sqstack;sqstack* st_create(void);int st_isempty(sqstack*);int st_push(sqstack*,datatype*);int st_pop(sqstack*,datatype*);int st_top(sqstack*,datatype*);void st_travel(sqstack*);int st_destroy(sqstack*);#endif

sqstack.c

#include <stdlib.h>
#include <stdio.h>
#include "sqstack.h"sqstack* st_create(void)
{sqstack*st;st = malloc(sizeof(*st));if(st == NULL)return NULL;st->top = -1;return st;
}
int st_isempty(sqstack*st)
{if(st->top == -1)return 0;return 1;
}
int st_push(sqstack*st,datatype* data)
{if(st->top == MAXSIZE-1 )return -1;st->data[++st->top] = *data;return 0;
}
int st_pop(sqstack*st,datatype*data)
{if(st_isempty(st) == 0)return -1;*data = st->data[st->top--];return 0;
}
int st_top(sqstack*st,datatype*data)
{if(st_isempty(st )== 0)return -1;*data = st->data[st->top];}
void st_travel(sqstack*st)
{if(st_isempty(st)== 0)return;for(int i=0;i<=st->top;i++){printf("%d ",st->data[i]);}printf("\n");
}int st_destroy(sqstack*st)
{free(st);st = NULL;return 0;
}

链式存储栈

本文的链式存储为对上一篇文章(链表高级篇)中的双向链表(lib2)的内容进行封装生成的二次使用,如大家感兴趣可以去上篇文章找下源码,也可以给我留言,我给大家私发代码。

main.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "stack.h"struct score_st
{int id;char name[32];int math;int chinese;
};void print_s(const void *record)
{const struct score_st*r = record;printf("%d %s %d %d \n",r->id,r->name,r->math ,r->chinese);}int main()
{int ret; STACK* st = stack_create(sizeof(struct score_st));struct score_st temp;if(st == NULL)return -1;for(int i=0;i<5;i++){temp.id = i;snprintf(temp.name,sizeof(temp.name),"std_%d",i);temp.math = rand()%100;temp.chinese = rand()%100;stack_push(st,&temp);}while(1){ret = stack_pop(st,&temp);if(ret == -1)break;print_s(&temp);}stack_destroy(st);return 0;
}

stack.c

#include <stdlib.h>
#include <stdio.h>
#include "stack.h"STACK* stack_create(int initsize)
{return llist_create(initsize);}int stack_push(STACK*ptr,const void *data)
{return llist_insert(ptr,data,LLIST_FORWARD);
}static int always_match(const void*p1,const void*p2)
{return 0;
}
int stack_pop(STACK*ptr ,void* data)
{return llist_fetch(ptr,(void*)0,always_match,data);
}
void stack_destroy(STACK* ptr)
{return llist_destroy(ptr);
}

stack.h

#ifndef STACK_H
#define STACK_H#include "llist.h"typedef LLIST STACK;STACK* stack_create(int);int stack_push(STACK*,const void *data);int stack_pop(STACK* ,void* daata);void stack_destroy(STACK*);#endif

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

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

相关文章

巩固学习3

jieba是优秀的中文分词第三方库。由于中文文本之间每个汉字都是连续书写的&#xff0c;我们需要通过特定的手段来获得其中的每个单词&#xff0c;这种手段就叫分词。而jieba是python计算生态中非常优秀的中文分词第三方库&#xff0c;需要通过安装来使用它。 简单来说&#xff…

Python_AI库 Pandas的loc和iloc的区别与使用实例

Python中Pandas的loc和iloc的区别与使用实例 在Pandas中&#xff0c;loc和iloc是两个常用的方法&#xff0c;用于基于标签&#xff08;label&#xff09;和整数位置&#xff08;integer location&#xff09;来选择数据。尽管两者在功能上有重叠&#xff0c;但它们在用法和性能…

去哪儿网机票服务请求体bella值逆向

作者声明&#xff1a;文章仅供学习交流与参考&#xff01;严禁用于任何商业与非法用途&#xff01;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请联系作者本人进行删除&#xff01; 一、加密定位 直接全局搜索bella&#xff0c;在可疑的地方下断&…

汇编--栈和寄存器

栈 栈是一种运算受限的线性表&#xff0c;其限定仅在表尾进行插入和删除操作的线性表&#xff0c;表尾也被叫做栈顶。简单概括就是我们对于元素的操作只能够在栈顶进行&#xff0c;也造就了其先进后出的结构特性。 栈 这种内存空间其实本质上有两种操作&#xff1a;将数据放入…

【12572物联网知识学习总结】

一、物联网的定义 物联网就是“物物相连的智能互联网”。它通过射频识别 &#xff08;RFID&#xff09;、红外感应器、全球定位系统、激光扫描器等信息传感 设备&#xff0c;按约定的协议&#xff0c;把任何物品与互联网连接起来&#xff0c;进行信息 交换和通讯&#xff0c;以…

在Ubuntu安装RPM文件

Ubuntu软件源包含数千个deb软件包&#xff0c;可以从Ubuntu软件中心或使用apt命令行安装。 Deb是所有基于Debian的Linux发行版&#xff0c;例如包括Ubuntu&#xff0c;Linux mint等发行版使用的安装包格式。 如果某些软件在Ubuntu软件源中不可用&#xff0c;可以通过启用适当的…

物联网实战--平台篇之(五)账户界面

目录 一、界面框架 二、首页(未登录) 三、验证码登录 四、密码登录 五、帐号注册 六、忘记密码 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/cat…

物联网网关制造生产全流程揭秘!

如果您正有开发和定制物联网网关的计划&#xff0c;找一个专业的物联网设备厂商协助您制造生产物联网网关可以节省大量时间和成本&#xff0c;可以让您能专注于当前核心业务&#xff0c;而无需将精力过多地投入到自己不擅长的领域。 当然&#xff0c;了解物联网网关的测试和制…

HSA-42014和安泰ATA-4014C高压功率放大器对比

企业背景&#xff1a; Aigtek是一家来自中国的专业从事测量仪器研发、生产和销售的高科技企业。公司主要研发和生产功率放大器、功率放大器模块、功率信号源、计量校准源等产品。核心团队主要是来自西安交通大学及西北工业大学的专家教授等联合组成研发团队&#xff0c;目前拥有…

OPC UA(二)

一、配置PC Station 在TIA博途软件平台中配置PC Station&#xff0c;见&#xff08;一&#xff09; 二、使用OPC Scout V10测试通信结果 1. 添加OPC UA Server站点 1.1启动OPC Scout V10 1.2 打开OPC Scout V10&#xff0c;在 Server explorer窗口&#xff0c;查找UA serv…

Linux流量分析工具 | nethogs

在应急过程中&#xff0c;经常会遇到应用访问缓慢&#xff0c;网络阻塞的情况&#xff0c;分析原因可能会想到存在恶意程序把带宽占满的可能。通过这样一个小工具可以快速定位异常占用带宽程序的路径、PID、占用流量大小或是排除由带宽占满导致服务器缓慢的猜想。 一、简介 Ne…

XML Schema(XSD)详解:定义 XML 文档结构合法性的完整指南

XML Schema描述了 XML 文档的结构。XML Schema语言也称为 XML Schema Definition&#xff08;XSD&#xff09;。 <?xml version"1.0"?> <xs:schema xmlns:xs"http://www.w3.org/2001/XMLSchema"><xs:element name"note"><…

Python学习——环境搭建

Python 介绍 Python&#xff08;英国发音&#xff1a;/ˈpaɪθən/ 美国发音&#xff1a;/ˈpaɪθɑːn/&#xff09;是一种广泛使用的解释型、高级编程、通用型编程语言&#xff0c;由吉多范罗苏姆创造&#xff0c;第一版发布于1991年。可以视之为一种改良&#xff08;加入…

spark分布式预测和保存过程中遇到的问题记录

文章目录 背景解决思路解决方案总结背景 内网已经搭建好spark环境,需要对台区负荷数据进行并发预测和保存到HUDI过程中出现py4j.handing of the above exception,another exception is empty报错,针对这一问题进行解决的记录 解决思路 首先上面报错是由于机器资源限制,内…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷1(公有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

DDD领域驱动模型设计

醍醐灌顶了朋友们 第一次写ddd还是 一路走来 丢失了东西 现在倒是也能找回来 只是有点可惜了 选择比努力更重要 独立功能 应用层&#xff1a;组织业务逻辑 领域&#xff1a;实体对象领域&#xff0c;业务核心 数据仓库&#xff1a; 不影响业务封装了数据操作&#xff0c;…

嵌入式开发九:STM32时钟系统

时钟对于单片机来说是非常重要的&#xff0c;它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。时钟系统犹如人的心脏&#xff0c;一旦有问题整个系统就崩溃。我们知道 STM32 属于高级单片机&#xff0c;其内部有很多的外设&#xff0c;但不是所有外设都使用同一时…

云计算安全扩展要求解析

云计算技术的信息系统&#xff0c;称为云计算平台&#xff0f;系统。 云计算平台&#xff0f;系统由设施、硬 件、资源抽象控制层、虚拟化计算资源、软件平台和应用软件等组成。 软件即服务(SaaS)、平台即服务 (PaaS) 、基础设施即服务ClaaS)是三种基本的云计算服务模式。在不同…

实验10配置 IPv4 和 IPv6 静态和 默认路由(课内实验)

上面这个是实验描述 下面是给的实验图 接下来我们跟着实验一步一步进行下去 第 1 部分&#xff1a;配置 IPv4 静态和 浮动静态默认路由配置ipv4静态路由&#xff1a;配置 IPv4静态和 浮动静态默认路由 步骤 1&#xff1a;配置一条 IPv4 静态 默认路由。在 Edge_Router 上&am…

快手快分销商家电话采集使用教程

要用Python编写一个快手快分销的访问框架&#xff0c;你可以使用Python的requests库来发送HTTP请求&#xff0c;并使用BeautifulSoup库来解析HTML页面。以下是一个简单的示例&#xff1a; 首先&#xff0c;你需要安装requests和BeautifulSoup库。可以使用pip命令进行安装&…