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,一经查实,立即删除!

相关文章

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;将数据放入…

在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…

Python学习——环境搭建

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

ASP.NET校园新闻发布系统的设计与实现

摘 要 校园新闻发布系统是在学校区域内为学校教育提供资源共享、信息交流和协同工作的计算机网络信息系统。随着网络技术的发展和Internet应用的普及&#xff0c;互联网已成为人们获取信息的重要来源。由于现在各大学校的教师和学生对信息的需求越来越高&#xff0c;校园信息…

Linux-笔记 修改开发板默认时区

1. 时区文件 使用命令date -R查看当前的默认时区&#xff0c;date - R命令会自动解析/etc/localtime 文件&#xff0c;而该文件又是指向“ /usr/share/zoneinfo/$主时区/$次时区 ”&#xff0c;当需要更改到指定的时区只要将/etc/localtime 文件软链接到 ”/usr/share/zoneinf…

13 华三三层链路聚和

13 华三三层链路聚和 AI 解析 华三三层静态路由是指在华三交换机上配置的一种路由方式。它通过在交换机上手动配置路由表&#xff0c;将不同网络之间的数据进行转发。 华三三层静态路由的配置步骤如下&#xff1a; 1. 配置交换机接口的IP地址&#xff1a;在交换机上选择要配…

95、动态规划-编辑距离

递归暴力解法 递归方法的基本思想是考虑最后一个字符的操作&#xff0c;然后根据这些操作递归处理子问题。 递归函数定义&#xff1a;定义一个递归函数 minDistance(i, j)&#xff0c;表示将 word1 的前 i 个字符转换成 word2 的前 j 个字符所需的最小操作数。 递归终止条件…

【计算机毕业设计】基于SSM++jsp的蜀都天香酒楼网站【源码+lw+部署文档+讲解】

目录 摘要 Abstract 目 录 1绪论 1.1研究背景与意义 1.2国内外研究现状 1.3研究内容 1.4论文结构 2相关技术介绍 2.1 B/S模式 2.2 MyEclipse开发环境 2.3 MySQL数据库 2.4 Java语言 2.5 JSP技术 2.6 Tomcat服务器 3系统分析 3.1需求分析 3.2可行性分析 3.2.1经济可行性 3.2.2技…

[Linux深度学习笔记5.9]

5.9笔记 DNS: 软硬链接&#xff1a; 软链接&#xff1a; 软链接&#xff1a;ln -s /源文件 /目标位置/链接名称》创建软链接1.既可以对目录使用&#xff0c;也可以对文件使用2.删除源文件&#xff0c;软链接不可用3.软链接可以跨文件系统使用4.源文件和软链接的inode号不同5.…