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

devtools/2024/11/14 3:29:36/


一.顺序栈的定义: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.ppmy.cn/devtools/116054.html

相关文章

WAN广域网技术--PPP和PPPoE

广域网基础概述 广域网&#xff08;Wide Area Network&#xff0c;WAN&#xff09;是一种覆盖广泛地区的计算机网络&#xff0c;它连接不同地理位置的计算机、服务器和设备。广域网通常用于连接不同城市、州或国家之间的网络&#xff0c;它通过互联网服务提供商&#xff08;ISP…

【农信网-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

【图虫创意-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

MTK zephyr平台:USB升级、枚举流程

一、USB升级流程 通过代码及log分析,当前平台升级过程在PL阶段进行 USB download相关代码 mtk/modules/hal/boot/preloader/platform/flashc/ mtk/modules/hal/boot/preloader/platform/board_name/flash/ mtk/modules/hal/boot/preloader/platform/board_name/src/drive…

【中国留学网-注册_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

【第十六章:Sentosa_DSML社区版-机器学习之异常检测】

【第十六章&#xff1a;Sentosa_DSML社区版-机器学习之异常检测】 机器学习异常检测是检测数据集中的异常数据的算子&#xff0c;一种高效的异常检测算法。它和随机森林类似&#xff0c;但每次选择划分属性和划分点&#xff08;值&#xff09;时都是随机的&#xff0c;而不是根…

基于单片机的智能小车的开发与设计

摘要&#xff1a;本文论述了基于 STC89C52 单片机的智能小车的开发与设计过程。该设计采用单片机、电机驱动及光电循迹等技术&#xff0c;保证小车在无人管理状态下&#xff0c;能按照预先设定的线路实现自动循迹功能。在电路结构设计中力求方便&#xff0c;可操作&#xff0c;…

Anaconda3-2021.11-Linux-x86_64.sh: line 399: TMP: unbound variable

文章目录 背景解决办法 背景 一般大家是不会遇到这个问题的。我这是因为服务器的驱动程序太老了&#xff0c;所以必须换老版本的Anaconda&#xff0c;然后在安装的时候就出现了文章标题的报错。 安装的时候&#xff0c;我的命令是&#xff1a; sh -u Anaconda3-2021.11-Linu…