当前位置: 首页 > news >正文

数据结构——栈(顺序结构)

一、栈的定义

栈是一种数据结构,它是一种只能在一端进行插入和删除操作的特殊线性表。这一端被称为栈顶,另一端被称为栈底。栈按照后进先出(LIFO)的原则进行操作(类似与手枪装弹后射出子弹的顺序)。在计算机科学中,栈被广泛应用于函数调用、表达式求值、内存管理等方面。

二、栈的结构

 栈(stack)是限定仅在表尾进行插入和删除操作的线性表。
 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。

 栈的插入操作,叫作进栈,也称压栈、入栈(PUSH)。
 栈的删除操作,叫作出栈,也有的叫作弹栈。(POP)。

三、栈的基本操作(顺序表)

顺序存储结构思路较为单一,相较于链式存储结构操作较为简单,不过在存在两个缺陷:

一是出栈和进栈(越靠近栈底,要移动的元素越多)操作更复杂。

二是栈的容量是固定的,不能超过栈顶。

1、栈的结构定义

typedef int SElemType;//SElemType类型依据实际情况而定,这里假设为 int
typedef struct{SElemType data[MAXSIZE];int top;//标记栈顶
}SqStack;

2、初始化栈

void StackInit(SqStack *s)
{s->top = -1;//空栈时top = -1;
}

3、进栈操作

int StackPush(SqStack *s,SElemType i)
{if(s->top == MAXSIZE-1){return ERROR;}s->top++;s->data[s->top] = i;return OK;
}

4、出栈操作

*出栈操作:返回出栈元素*/
//出栈操作无法直接删除中间元素,要按顺序从栈顶元素开始删除
int StackPop(SqStack *s,SElemType i)
{if(s->top == -1){return ERROR;}i = s->data[s->top];s->top--;return i;
}

5、打印所有栈元素

/*打印所有栈元素*/
void StackElem(SqStack *s)
{printf("所有栈元素如下:");while(s->top != -1){printf("%d ",s->data[s->top]);s->top--;}printf("\n");
}

 6、获取栈元素

/*获取栈元素*/
SElemType StackGetElem(SqStack *s,int i)
{if(i > MAXSIZE-1 || s->top == -1){return ERROR;}return s->data[i];
}

四、案例示例

代码示例:

#include "stack.h"
#define MAXSIZE 10int main()
{printf("依次输入栈元素:");int k[MAXSIZE] = {};SqStack Slist;StackInit(&Slist);for(int i = 0;i < MAXSIZE;i++){scanf("%d",&k[i]);}for(int i = 0;i < MAXSIZE;i++){StackPush(&Slist,k[i]);}printf("输入的第二个元素:%d\n",StackGetElem(&Slist,1));StackElem(&Slist);return 0;
}

运行结果:

 五、顺序存储结构的优缺点

顺序存储结构: 优点:实现简单,易于理解和实现;不涉及指针操作,节省存储空间;随机存取方便,时间复杂度为O(1)。 缺点:容量固定,不易动态扩展;插入和删除操作需要移动元素,时间复杂度为O(n)。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Visual Studio Code + vue快速安装配置Node.js+Vue+webpack+vscode
  • 【Java25】内部类
  • Ubuntu20.04安装Elasticsearch
  • 【STM32 HAL库】ADC
  • 古籍双层PDF制作教程:保姆级古籍数字化教程
  • 掌握互联网路由选择协议:从基础入门到实战
  • ESP8266用AT指令实现连接MQTT
  • 时间序列预测领域公开数据集数据集下载
  • react 样式管理方案除了 styled-components,还有什么推荐的
  • 黑马微服务拆分2 (路由 登录 配置)
  • 学习笔记9:雪花算法
  • 学习笔记12:域名。全球加速,自定义源站,自定义CDN加速
  • JS设计模式(一)单例模式
  • sudo: dnf:找不到命令
  • js-去重多种
  • JavaScript-如何实现克隆(clone)函数
  • CODING 缺陷管理功能正式开始公测
  • Intervention/image 图片处理扩展包的安装和使用
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java编程基础24——递归练习
  • java中的hashCode
  • uni-app项目数字滚动
  • 码农张的Bug人生 - 见面之礼
  • 前端代码风格自动化系列(二)之Commitlint
  • 山寨一个 Promise
  • 以太坊客户端Geth命令参数详解
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • #{}和${}的区别?
  • #Linux(make工具和makefile文件以及makefile语法)
  • #VERDI# 关于如何查看FSM状态机的方法
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2022 CVPR) Unbiased Teacher v2
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (十六)Flask之蓝图
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .bat批处理(六):替换字符串中匹配的子串
  • .gitignore文件_Git:.gitignore
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET 通过系统影子账户实现权限维持
  • .net通用权限框架B/S (三)--MODEL层(2)
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [ANT] 项目中应用ANT
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [BUUCTF]-Reverse:reverse3解析
  • [C/C++]数据结构 栈和队列()
  • [gdc19]《战神4》中的全局光照技术
  • [HackMyVM]靶场 VivifyTech
  • [HJ56 完全数计算]