栈————顺序栈和链式栈

目录

顺序栈

1、初始化顺序栈 

2、判栈空

3、进栈

4、出栈

5、读栈顶元素

6、遍历

链式栈

1、初始化链式栈

2、断链式栈是否为空判

3、入栈(插入)

​编辑​编辑

4、出栈(删除)

5、读取栈顶元素

6、输出链式栈中各个节点的值(遍历)


作为一种数据结构,是一种只能在同一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,最先进入的数据被压入栈底,最后进入的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)也就是后进先出(LIFO)或者先进后出(FILO)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

1.什么是栈,我们引用图例来帮助理解:

顺序栈

1、初始化顺序栈 
SqStack *initStack(){SqStack *s; s = (SqStack*)malloc(sizeof(SqStack)); //划分内存空间if(!s){//判断内存空间的划分是否成功printf("空间不足\n");return NULL;}else{s->top = -1;//栈空以-1标记return s;  //返回栈}
}
2、判栈空
//判栈空
int stackEmpty(SqStack *s){	if(s->top==-1){         return 1;       }else{return 0;      }
}
3、进栈
//进栈 
int push(SqStack *s,datatype x){//入栈操作,s代表栈,x代表我们入栈的值 if(s->top==MAXSIZE-1){printf("\nThe squence stack is full!");return 0;}else{s->data[++s->top]=x;//指针先加一,在入栈 return 1; }		    
} 
4、出栈
//出栈 
int pop(SqStack *s,datatype *x){//出栈操作,s代表栈,指针x代表输出的值,指针实参为地址if(stackEmpty(s))          //栈空,报错 {printf("\nThe squence stack is empty!");return 0;}else{*x=s->data[s->top--];//先出栈,指针在减一 return 1;}	    
} 
5、读栈顶元素
//读栈顶元素 
int getTop(SqStack *s){if(stackEmpty(s))          //栈空,报错 {printf("\n栈是空的!");exit(1);}else{return s->data[s->top];} 
}
6、遍历
//遍历 
int display(SqStack *s){int i;printf("当前栈中的元素:\n");for(i = s->top; i >= 0; i--)printf("%3d", s->data[i]);printf("\n");return 0;
}

链式栈

链式栈是一种数据存储结构,可以通过单链表的方式来实现。

优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,且除了存放每个栈元素的数据域,还需要额外分配指针空间用来存放指针的指针域。也就是有一个栈顶指针,指向了一个单链表,单链表存数据,栈顶指针取,放数据。

什么是链式栈?

链式栈,其实和单链表很相似,进栈可以理解为单链表的头插法,出栈可以理解为带头结点的单链表输出,只不过它的头结点就是我们的栈顶,栈顶用来输入和输出。

1、初始化链式栈
//初始化链式栈
int initStack() {return  NULL;
}
2、断链式栈是否为空判
//判断链式栈是否为空
int isEmpty(LinkStack *top) {return (top?0:1); //栈空返回 1
}
3、入栈(插入)
//入栈(插入)
LinkStack *push(LinkStack *top,datatype x){LinkStack *p;p = (LinkStack*)malloc(sizeof(LinkStack));//分配空间p->data = x;      //设置新结点的值p->next = top;   //将新元素插入栈中top = p;          //将新元素设为栈顶return top;
}
4、出栈(删除)
//出栈(删除)
LinkStack *pop(LinkStack *top,datatype *x) {LinkStack *q;if(!top){printf("栈为空,无法出栈!\n");return NULL;}q = top;         //指向被删除的栈顶  *x=q->data;      //返回我们出栈的值 top = top->next;   //修改栈顶指针free(q);         //释放已经出栈的结点return top;
}
5、读取栈顶元素
//读取栈顶元素
int getTop(LinkStack *top) {if (!top) {printf("栈为空,无法读取栈顶元素!\n");return 0;}return top->data;//返回栈顶的值
}
6、输出链式栈中各个节点的值(遍历)
//输出链式栈中各个节点的值
void display(LinkStack *top) {LinkStack *p = top;if (!p) {printf("栈为空,无法读取栈顶元素!\n");}while (p) {printf("%3d ", p->data);p = p->next;}printf("\n");
}

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

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

相关文章

Express.js项目实战(1)—— 我的藏书馆

首先新建文件夹——myLibrary 在vscode中点击文件>点击 Duplicate Workspace(以工作区的方式打开文件夹myLibrary) 点击duplicate Workspace(打开工作区) 之后,会出现以下界面 点击打开文件夹,选择新建的文件夹,会出…

Vscode + PlatformIO + Arduino 搭建EPS32开发环境

Vscode PlatformIO Arduino 搭建EPS32开发环境 文章目录 Vscode PlatformIO Arduino 搭建EPS32开发环境1. Vscode插件安装2. 使用PlatformIO新建工程3.工程文件的基本结构4.一个基本的测试用例Reference 1. Vscode插件安装 如何下载vscode这里不再赘述,完成基本…

超低代码智能音频开发来了:XMOS宣布与DSP Concepts建立合作伙伴关系推动AIoT音频应用

人工智能和芯片供应商 XMOS 宣布与嵌入式音频软件专家 DSP Concepts 建立合作伙伴关系。该合作协议将允许音频开发人员将 XMOS 的高度确定性、低延迟的 xcore.ai 平台与 DSP Concepts 的 Audio Weaver 软件结合起来。该软件使用户能够利用多核算力以图形方式设计和调试音频和语…

EXCEL VBA与CSV的结合使用,提高多个CSV的处

EXCEL VBA与CSV的结合使用,提高多CSV的处理 1、首先创建一个文本文件,然后将copy *.csv 合并.csv粘贴,并重命名后缀未bat 2、将bat和多个CSV放一个路径下 3、双击运行合并.bat,运行完成会后生成合并.csv 4、将csv用Excel打开&…

ALPHA开发板上PHY网络芯片LAN8720

一. 简介 正点原子的开发板 ALPHA开发板,有线网络硬件方案所使用的也是最常用的一种方案,IMX6ULL芯片内部是自带 MAC网络芯片的,所以,也就是采用 "SOC内部集成网络MAC外设 PHY网络芯片方案"。 ALPHA开发板使用的PHY网…

算法第三十七天-旋转链表

旋转链表 题目要求 解题思路 题意:将链表中每个元素向后移动k个位置,相当于把链表的后面k%len节点移到链表的最前面。 所以本题步骤为: 1.求出链表长度; 2.找出倒数第k1个节点 3.链表重整:将连败哦的倒数第k1个节点和…

讲解pwngdb的用法,以csapp的bomb lab phase_1为例

参考资料 Guide to Faster, Less Frustrating Debugging 什么情况下会使用gbd 需要逆向ELF文件时(掌握gdb的使用,是二进制安全的基本功)开发程序时,程序执行结果不符合预期 动态调试ELF文件可以使用另外一种方法:IDA的远程linux动态调试。个…

java引入下载的依赖包配置

maven中央仓库没有依赖包&#xff0c;但是个别网站有可以下载的依赖包下载依赖包并引入的配置在maven工程目录下建立lib目录&#xff0c;并将下载的jar包放入在pom.xml文件中配置本地依赖 <dependency><groupId>org.ejml</groupId><artifactId>…

10.循环位移

问题描述 给定一个正好六位的正整数t&#xff0c;请将循环左移一位后输出。 所谓循环左移一位&#xff0c;是指将原来的十万位变为个位&#xff0c;原来的万位到个位向左移动依次变为十万位到十位。 例如:194910左移一位变为949101 又如:987123左移一位变为871239 输入格式 输入…

Java基础学习: hutool之CollUtil集合操作工具类

文章目录 一、介绍二、Hutool集合操作示例1、判断是否为空&#xff1a;2、判断是否非空3、集合是否包含某个元素4、集合是否包含某些元素5、集合是否不包含某些元素6、两个集合的交集操作7、两个集合的并集操作8、两个集合的差集操作9、集合元素是否相等10、集合转换为字符串&a…

LeetCode——动态规划(Java)

动态规划 简介[简单] 509. 斐波那契数[简单] 70. 爬楼梯[简单] 746. 使用最小花费爬楼梯[中等] 62. 不同路径[中等] 63. 不同路径 II[中等] 343. 整数拆分[中等] 96. 不同的二叉搜索树背包问题01背包[中等] 416. 分割等和子集[中等] 1049. 最后一块石头的重量 II[中等] 494. 目…

Nginx: proxy_set_header 与 add_header 区别

proxy_set_header 1 &#xff09;概述 proxy_set_header 和 add_header 是 Nginx 配置中两个不同的指令, 它们各自有不同的用途proxy_set_header 指令用于修改转发到代理服务器&#xff08;通常是后端应用服务器&#xff09;的 HTTP 请求头它允许您设置或覆盖请求头中的字段&a…

【游戏分析】FPS游戏狩猎百发百中

某某游戏狩猎玩法及其类似于FPS游戏 即3D射击 所以同样拥有 自动瞄准功能和爆头功能 想达到百发百中我们就要精准的计算出3D朝向值 读取人物坐标 遍历怪物,读取怪物坐标比较简单,不过多陈诉 朝向自然而然一定是我们和敌人的坐标计算出来的 那么怎么计算的呢&#xff1f; 我…

JAVA学习笔记21(访问修饰符)

1.访问修饰符 ​ *基本介绍 ​ java提供四种访问控制修饰符号&#xff0c;用于控制方法和属性(成员变量)的访问权限(范围) 1.公开级别&#xff1a;用public修饰&#xff0c;对外公开 2.受保护级别&#xff1a;用protected修饰&#xff0c;对子类和同一个包中的类公开 3.默…

基础知识系列

文章目录 一、linux passwd文件 一、linux passwd文件 linux中&#xff0c;用户名存放在/etc/passwd中&#xff0c;密码存放在/etc/shadow中。/etc/passwd只允许root用户可读可写&#xff0c;root组的用户可读&#xff0c;其他用户不可读不可写不可执行。/etc/shadow只允许roo…

手写简易操作系统(二十)--实现堆内存管理

前情提要 前面我们实现了 0x80 中断&#xff0c;并实现了两个中断调用&#xff0c;getpid 和 write&#xff0c;其中 write 还由于没有实现文件系统&#xff0c;是个残血版&#xff0c;这一节我们实现堆内存管理。 一、arena 在计算机科学中&#xff0c;“arena” 内存管理通…

DC-9靶场

一.环境搭建 1.下载地址 靶机下载地址&#xff1a;https://download.vulnhub.com/dc/DC-9.zip 2.虚拟机配置 设置虚拟机为nat&#xff0c;遇到错误点重试和是 开启虚拟机如下图所示 二.开始渗透 1. 信息收集 查找靶机的ip地址 arp-scan -l 发现靶机的ip地址为192.168.11…

C++从入门到精通——auto的使用

auto 前言一、auto类型别名思考二、auto简介三、auto的使用细则auto与指针和引用结合起来使用在同一行定义多个变量auto不能推导的场景auto不能作为函数的参数auto不能直接用来声明数组 lambda表达式 前言 C的auto关键字用于自动推导变量的类型&#xff0c;让编译器根据变量的…

如何使用单片机 pwm 控制 mos 管?

目录 选择适合的硬件 连接电路 编写代码 参考示例 程序一 程序二 测试与调试 注意事项 使用单片机&#xff08;如常见的Arduino、STM32等&#xff09;通过PWM&#xff08;脉冲宽度调制&#xff09;控制MOS管&#xff08;金属氧化物半导体场效应管&#xff09;是一种常见…

Linux使用Docker部署RStudio Server结合内网穿透实现公网访问本地服务

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问…