数据结构-3.2.栈的顺序存储实现


一.顺序栈的定义:top指针指向栈顶元素

1.图解:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义栈最多存入的元素个数
​
typedef struct
{int data[MaxSize]; //静态数组存放栈中元素int top; //栈顶指针 
} SqStack; 
​
int main()
{SqStack S;//声明一个顺序栈(分配空间)//后续操作。。。 return 0;
}

3.实例:

栈顶指针为4,因为第五个元素e下标为4。


二.初始化栈以及判断栈是否为空:

:栈顶指针指向栈顶元素

1.图解:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义栈最多存入的元素个数
​
typedef struct
{int data[MaxSize]; //静态数组存放栈中元素int top; //栈顶指针 
} SqStack; 
​
//初始化栈
void InitStack(SqStack &S)
{S.top=-1; //初始化栈顶指针,由于一开始没有元素,所以指向-1 
} 
​
//判断栈空
bool StackEmpty(SqStack S) //此时只要方法的结果即可,不需要返回S,所以不用& 
{if( S.top==-1 ){return true; //栈空 } else{return false; //不空 }
} 
​
int main()
{SqStack S;//声明一个顺序栈(分配空间)InitStack(S);//后续操作。。。 return 0;
}

三.进栈操作(插入元素):

1.图解:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义栈最多存入的元素个数
​
typedef struct
{int data[MaxSize]; //静态数组存放栈中元素int top; //栈顶指针 
} SqStack; 
​
//新元素入栈
bool Push(SqStack &S,int x)
{if( S.top==MaxSize-1 )//因为此时栈是静态数组,有最大存储范围,所以要判断是否栈满 {return false; //栈满,无法再插入新元素,报错 }//走到这儿说明栈没满S.top = S.top+1; //指针先加1-->腾出位置 S.data[S.top] = x; //新元素入栈 return true; 
} 
​
int main()
{return 0;
}

四.出栈操作(删除元素):

1.图解:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义栈最多存入的元素个数
​
typedef struct
{int data[MaxSize]; //静态数组存放栈中元素int top; //栈顶指针 
} SqStack;
​
//出栈操作
bool Pop(SqStack &S,int &x) //x有&,代表出栈操作里操作的x和函数调用者定义的x对应的是同一份数据,而不是复制品 
{if( S.top==-1 ){return false; //栈空,报错 }//走到这儿说明栈不为空x = S.data[S.top]; //栈顶元素先出栈S.top = S.top-1; //指针再减1return true; 
} 
​
int main()
{return 0;
}

五.读取栈顶元素的操作:

1.图解:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义栈最多存入的元素个数
​
typedef struct
{int data[MaxSize]; //静态数组存放栈中元素int top; //栈顶指针 
} SqStack;
​
//出栈操作
bool Pop(SqStack &S,int &x)
{if(S.top==-1){return false; //栈空,报错 }x = S.data[S.top--]; //先出栈,指针再减1return true; 
} 
​
//读取栈顶元素
bool GetTop(SqStack S,int &x)
{if(S.top==-1){return false;//栈空,报错 }x = S.data[S.top]; //x记录栈顶元素,x就是栈顶元素 return true; 
} 
​
int main()
{return 0;
}

六.另一种设计方式,针对top指针:top指针指向栈顶元素下一个可以插入元素的位置

针对top指针,还有另一种设计方式,可以一开始就让top指针指向0,因此判断栈是否为空只需要判断top是否为0即可:

这种方式top指针指向下一个可以插入元素的位置,因此接下来有数据元素入栈的话,举例如下:

此时如果让一个新的数据元素x入栈时,需要先把x放入top指针指向的位置(此时top指针指向下一个可以插入元素的位置),再让top指针加一:

此时如果让栈顶元素x出栈时,需要先让top指针减一(此时top指针指向下一个可以插入元素的位置),再把top指向的数据元素传回去:

顺序栈的缺点可以通过 链式存储的方式来实现栈或者可以在刚开始的时候给栈分配一个比较大的连续的存储空间(但刚开始分配大的存储空间会导致内存资源的浪费)或者共享栈来提高内存空间的利用率 来解决。


七.共享栈:

如果往0号栈放入数据元素的话,那么从下往上依次递增;

如果往1号栈放入数据元素的话,那么从上往下依次递减。

逻辑上用了两个栈,但物理上共享着同一片存储空间,这就会提高内存资源的利用率:

共享栈也会被存满,当top0+1 == top1时共享栈就满了:


八.总结:


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

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

相关文章

金手指设计

"MCP6294"。是一个轨到轨, 带宽为 10MHz 的 低功耗放大器. 对LM358测量 10MHz 范围内的频率特性&#xff0c;在 8MHz 左右&#xff0c;输出相移超过了 180。MCP6294的频率特性&#xff0c;则显示在 10MHz 运放相移之后 100左右。 对比两个运放的频率特性&#xff…

八股文-JVM

是什么&#xff1f;有什么用&#xff1f;谁发明的&#xff1f;什么时候发明的&#xff1f; Java虚拟机&#xff0c;用来运行Java程序&#xff0c;有很多个版本的虚拟机&#xff0c;比如HotSpot&#xff0c;最开始是SUN公司开发人员&#xff0c;和Java一起发布&#xff0c;现在…

通信工程学习:什么是PON无源光网络

PON&#xff1a;无源光网络 PON&#xff08;Passive Optical Network&#xff0c;无源光纤网络&#xff09;是一种采用光分路器等无源光器件进行信号传输和分配的光纤接入技术。它利用光纤作为传输媒介&#xff0c;通过无源设备将光信号从中心局&#xff08;如光线路终端OLT&am…

测试开发基础——软件测试中的bug

二、软件测试中的Bug 1. 软件测试的生命周期 软件测试贯穿于软件的整个生命周期 需求分析 测试计划 测试设计与开发 测试执行 测试评估 上线 运行维护 用户角度&#xff1a;软件需求是否合理 技术角度&#xff1a;技术上是否可行&#xff0c;是否还有优化空间 测试角度…

Android 15 正式发布至 AOSP

Google官方宣布&#xff0c;将于近期发布了 Android 15&#xff0c;而在早些时候&#xff0c;Google已经将其源代码推送至 Android 开源项目 (AOSP)。未来几周内&#xff0c;Android 15 将在受支持的 Pixel 设备上正式推出&#xff0c;并将于今年晚些时候在三星、Honor、iQOO、…

[vue2+axios]下载文件+文件下载为乱码

export function downloadKnowledage(parameter) {return axios({url: /knowledage/download,method: GET,params: parameter,responseType: blob}) }添加 responseType: blob’解决以下乱码现象 使用触发a标签下载文件 downloadKnowledage(data).then((res) > {let link …

高效处理NPE!!

相信不少小伙伴已经被java的NPE(Null Pointer Exception)所谓的空指针异常搞的头昏脑涨,有大佬说过“防止 NPE&#xff0c;是程序员的基本修养。”但是修养归修养&#xff0c;也是我们程序员最头疼的问题之一&#xff0c;那么我们今天就要尽可能的利用Java8的新特性 Optional来…

AI绘画与摄影新纪元:ChatGPT+Midjourney+文心一格 共绘梦幻世界

文章目录 一、AI艺术的新时代二、ChatGPT&#xff1a;创意的引擎与灵感的火花三、Midjourney&#xff1a;图像生成的魔法与技术的奇迹四、文心一格&#xff1a;艺术的升华与情感的共鸣五、融合创新&#xff1a;AI绘画与摄影实战的无限可能六、应用场景与实践案例AI艺术的美好未…

11 vue3之插槽全家桶

插槽就是子组件中的提供给父组件使用的一个占位符&#xff0c;用<slot></slot> 表示&#xff0c;父组件可以在这个占位符中填充任何模板代码&#xff0c;如 HTML、组件等&#xff0c;填充的内容会替换子组件的<slot></slot>标签。 匿名插槽 1.在子组…

一个场景是否可以同时选择CPU和GPU渲染

一个场景是否可以同时选择CPU和GPU渲染&#xff0c;主要取决于所使用的渲染软件及其支持的渲染引擎。在大多数情况下&#xff0c;现代渲染软件如3DMax等确实支持同时利用CPU和GPU进行渲染&#xff0c;以提高渲染效率和速度。 渲染软件的支持 以3DMax为例&#xff0c;它允许用…

xxl-job、Quartz、power-job、elastic-job对比选型

一、框架对比 1. Quartz 优点&#xff1a;稳定性和可扩展性好&#xff0c;适用于企业级应用&#xff1b;调度功能丰富&#xff0c;满足多种需求。 缺点&#xff1a;本身不提供原生的分布式支持&#xff0c;需要通过扩展或与其他组件结合来实现分布式任务调度&#xff1b;调度…

使用NotificationChannel实现后台视频上传

1、添加依赖 implementation net.gotev:uploadservice:4.8.0 implementation net.gotev:uploadservice-okhttp:4.8.02、在application中初始化服务&#xff1a; //初始化上传服务private fun initUploadService() {// 文件上传createNotificationChannel()//notificationChan…

算法里面的离散化

一、离散化&#xff08;discretization&#xff09;在算法和数据结构中指的是将连续的输入数据映射到离散的值或者范围&#xff0c;从而使得处理和计算变得更高效。通常用于处理大范围或者无限可能的输入&#xff0c;以便将其转化为有限的、可以有效处理的范围。 离散化的定义…

【深度学习】(3)--损失函数

文章目录 损失函数一、L1Loss损失函数1. 定义2. 优缺点3. 应用 二、NLLLoss损失函数1. 定义与原理2. 优点与注意3. 应用 三、MSELoss损失函数1. 定义与原理2. 优点与注意3. 应用 四、BCELoss损失函数1. 定义与原理2. 优点与注意3. 应用 五、CrossEntropyLoss损失函数1. 定义与原…

9.19总结

这几天学习了网络流 1&#xff0c;EK ek的主要思路是不断通过bfs找到增广路&#xff0c;找到增广路再建立反向边&#xff0c;直到不能再bfs到汇点&#xff0c;为什么可以通过建反向边呢&#xff1f;以上图举例&#xff0c;上图走完第一条增广路建立了一条反向边&#xff0c;当…

Maya动画基础

Maya动画基础教程&#xff08;完整&#xff09;_哔哩哔哩_bilibili 第一集 动画基础设置 altv播放动画 选择撕下副本 右键---播放预览 第二集 k帧记录物体的空间信息 初始位置清零 删除历史记录 s键key帧 自动记录位置信息 删除帧&#xff0c;按住右键选择delete 按shif…

Python if 语句优化技巧

大家好&#xff01;今天我们来聊聊Python中的if语句优化技巧。if语句是Python中最基本的控制结构之一&#xff0c;它用于根据条件执行不同的代码块。虽然if语句本身非常简单&#xff0c;但通过一些小技巧&#xff0c;可以让我们的代码更加高效、简洁。接下来&#xff0c;我们将…

LeetCode 算法笔记-第 04 章 基础算法篇

1.枚举 采用枚举算法解题的一般思路如下&#xff1a; 确定枚举对象、枚举范围和判断条件&#xff0c;并判断条件设立的正确性。一一枚举可能的情况&#xff0c;并验证是否是问题的解。考虑提高枚举算法的效率。 我们可以从下面几个方面考虑提高算法的效率&#xff1a; 抓住…

js中两种异步方式:async+await以及then

第一种方式 第二种方式 完整代码 前端代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>pywebv…

重学SpringBoot3-SpringApplicationRunListener

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-SpringApplicationRunListener 1. 基本作用2. 如何实现2.1. 创建SpringApplicationRunListener2.2. 注册SpringApplicationRunListener2.3. 完整示例 3.…