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

数据结构-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时共享栈就满了:


八.总结:


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于Python的自然语言处理系列(14):TorchText + biGRU + Attention + Teacher Forcing
  • 深入理解Go语言的方法定义与使用
  • sqli-lab靶场学习(二)——Less8-10(盲注、时间盲注)
  • 前端开发之迭代器模式
  • 从数据仓库到数据中台再到数据飞轮:我了解的数据技术进化史
  • 代码管理-使用TortoiseGit同步项目到Github/Gitee
  • 运行npm install 时,卡在sill idealTree buildDeps没有反应
  • SCRM电商管理后台Axure高保真原型 源文件
  • 电脑提示丢失mfc140u.dll的详细解决方案,mfc140u.dll文件是什么
  • C++初阶:STL详解(五)——vector的模拟实现
  • 初中生物--7.生物圈中的绿色植物(二)
  • java项目之在线考试与学习交流网页平台源码(springboot)
  • QT 串口上位机读卡显示
  • 枚举(not二分)
  • TCP 和 UDP 协议的区别?
  • [LeetCode] Wiggle Sort
  • 【个人向】《HTTP图解》阅后小结
  • 30秒的PHP代码片段(1)数组 - Array
  • create-react-app做的留言板
  • js 实现textarea输入字数提示
  • JS数组方法汇总
  • JS题目及答案整理
  • leetcode386. Lexicographical Numbers
  • mysql外键的使用
  • Rancher如何对接Ceph-RBD块存储
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 分类模型——Logistics Regression
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 力扣(LeetCode)357
  • 力扣(LeetCode)965
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 如何优雅地使用 Sublime Text
  • 我看到的前端
  • 一起参Ember.js讨论、问答社区。
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • 正则表达式-基础知识Review
  • ​configparser --- 配置文件解析器​
  • ​人工智能书单(数学基础篇)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (10)STL算法之搜索(二) 二分查找
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (Ruby)Ubuntu12.04安装Rails环境
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (黑马C++)L06 重载与继承
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十三)Maven插件解析运行机制
  • (五)Python 垃圾回收机制
  • (一)RocketMQ初步认识
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (已解决)报错:Could not load the Qt platform plugin “xcb“