顺序栈的基本操作(超详细)

目录

前言

一、顺序栈的定义

二、顺序栈的c++语言结构描述表示

三、顺序栈中基本操作的实现

3.1顺序栈的初始化 

3.2判断顺序栈是否为空

3.3求顺序栈的长度

3.4清空顺序栈

3.5销毁顺序栈

3.6顺序栈的入栈

3.7顺序栈的出栈

3.8求栈顶元素

3.9遍历顺序栈 

 四、顺序栈的代码实现

五、测试结果

五、总结


前言

本文参考王卓老师的数据结构视频和严蔚敏老师的《数据结构》


一、顺序栈的定义

栈:操作受限的线性表,限定仅在表尾进行插入和删除操作的线性表,即后进先出。这一端被称为栈顶,相对地,把另一端称为栈底。

顺序栈:用顺序结构存储的栈

例子:类似子弹压入弹夹,后放入的子弹可以先从弹夹弹出来。

特点:简单方便,但是容易溢出(上溢或者下溢)

二、顺序栈的c++语言结构描述表示

代码如下(示例):

typedef struct sqstack{
    int *top;//栈顶指针
    int *base;//栈底指针
    int stackSize;//栈的最大容量 
}stack;

三、顺序栈中基本操作的实现

3.1顺序栈的初始化 

数组用c++的new来动态开辟

当内存不够的时候,也即是s.base为空,则直接结束

不为空的时候,则栈的栈顶指针与栈底指针都指向同一位置

代码如下(示例):

void initStack(stack &s)
{s.base=new int[MaxSize];if(!s.base)	exit(0);//内存分配失败,结束s.top=s.base;//初始的时候栈的top与base相等 s.stackSize=MaxSize;//栈的最大容量	
} 

3.2判断顺序栈是否为空

栈顶指针与栈底指针都指向同一位置,即s.base==s.top的时候,则栈为空,返回1

否则,不为空,返回0

 代码如下(示例):

int isEmpty(stack s)
{if(s.base==s.top)return 1;//表示为空,无元素return 0;//不为空	
} 

3.3求顺序栈的长度

长度即为有多少个元素,可以用s.top-s.base

 代码如下(示例):

int stackLength(stack s)
{return s.top-s.base;
}

3.4清空顺序栈

当s.base不为空的时候,让s.top(栈顶指针)直接指向s.base(栈底),则把所有的元素逻辑上清空了

而当s.base为空的时候,则栈已经被销毁了,无需清空

 代码如下(示例):

void CleanStack(stack &s)
{if(s.base){s.top=s.base;cout<<"成功清空"<<endl;}elsecout<<"栈已经被销毁,无需清空"<<endl;
}

3.5销毁顺序栈

从物理层次销毁

也即是用delete将整个s.base从内存中删除

 代码如下(示例):

void DestoryStack(stack &s)
{if(s.base){delete s.base;s.stackSize=0;s.base=NULL;s.top=NULL;cout<<"成功销毁"<<endl;}elsecout<<"栈已经被销毁,无需销毁"<<endl;
}

3.6顺序栈的入栈

首先判断栈是否已经满了,如果满了则无法入栈,否则可以入栈

 代码如下(示例):

void push(stack &s,int e)
{if((s.top-s.base)==s.stackSize)cout<<"栈满了,无法添加新元素"<<endl;else{*(s.top)=e;s.top++;	cout<<"添加成功"<<endl;}	
} 

3.7顺序栈的出栈

首先判断栈是否为空,如果为空,则无法出栈,否则可以出栈 

  代码如下(示例):

void pop(stack &s,int &e)
{if(isEmpty(s)){cout<<"栈为空,无法弹出"<<endl;}	else{s.top--;e=*(s.top);cout<<"成功弹出"<<endl; }
} 

3.8求栈顶元素

 先判断栈是否为空,为空则无法求栈顶元素,否则可以求栈顶元素

  代码如下(示例):

int top(stack s)
{if(isEmpty(s)){cout<<"栈为空,没有栈顶元素"<<endl;return -1;}else{s.top--;return *(s.top);}
}

3.9遍历顺序栈 

从栈底开始遍历 

  代码如下(示例):

void traverse(stack s)
{int length=stackLength(s);if(length>0){cout<<"顺序栈的元素为:(从栈底开始遍历)"<<endl;for(int i=0;i<length;i++)cout<<s.base[i]<<" ";}	elsecout<<"顺序栈为空"<<endl;
} 

 四、顺序栈的代码实现

#include <iostream>
using namespace std;
const int MaxSize=100;
typedef struct sqstack{int *top;//栈顶指针int *base;//栈底指针int stackSize;//栈的最大容量 
}stack;
void initStack(stack &s)
{s.base=new int[MaxSize];if(!s.base)	exit(0);//内存分配失败,结束s.top=s.base;//初始的时候栈的top与base相等 s.stackSize=MaxSize;//栈的最大容量	
} 
int isEmpty(stack s)
{if(s.base==s.top)return 1;//表示为空,无元素return 0;//不为空	
} 
int stackLength(stack s)
{return s.top-s.base;
}
void CleanStack(stack &s)
{if(s.base){s.top=s.base;cout<<"成功清空"<<endl;}elsecout<<"栈已经被销毁,无需清空"<<endl;
}
void DestoryStack(stack &s)
{if(s.base){delete s.base;s.stackSize=0;s.base=NULL;s.top=NULL;cout<<"成功销毁"<<endl;}elsecout<<"栈已经被销毁,无需销毁"<<endl;
}
//入栈
void push(stack &s,int e)
{if((s.top-s.base)==s.stackSize)cout<<"栈满了,无法添加新元素"<<endl;else{*(s.top)=e;s.top++;	cout<<"添加成功"<<endl;}	
} 
//出栈
void pop(stack &s,int &e)
{if(isEmpty(s)){cout<<"栈为空,无法弹出"<<endl;}	else{s.top--;e=*(s.top);cout<<"成功弹出"<<endl; }
} 
int top(stack s)
{if(isEmpty(s)){cout<<"栈为空,没有栈顶元素"<<endl;return -1;}else{s.top--;return *(s.top);}
}
void traverse(stack s)
{int length=stackLength(s);if(length>0){cout<<"顺序栈的元素为:(从栈底开始遍历)"<<endl;for(int i=0;i<length;i++)cout<<s.base[i]<<" ";}	elsecout<<"顺序栈为空"<<endl;
} 
void menu()
{cout<<"**********************************"<<endl;cout<<"1.初始化"<<endl;cout<<"2.判断栈是否为空"<<endl;cout<<"3.求栈的长度"<<endl;cout<<"4.清空栈"<<endl;cout<<"5.销毁栈"<<endl;cout<<"6.入栈"<<endl;cout<<"7.出栈"<<endl;cout<<"8.求栈顶元素"<<endl;cout<<"9.遍历顺序栈"<<endl;cout<<"10.退出"<<endl;cout<<"**********************************"<<endl;
}
int main()
{int choice;stack s;int e1,e2;while(1){menu();cin>>choice;switch(choice){case 1:initStack(s);cout<<"初始化成功"<<endl;break;case 2:if(isEmpty(s))cout<<"栈为空"<<endl;elsecout<<"栈不为空"<<endl; break;case 3:cout<<"栈的长度为"<<stackLength(s)<<endl;break;case 4:CleanStack(s);break;case 5:DestoryStack(s);break;	case 6:cout<<"请输入想要入栈的元素值:"<<endl;cin>>e1;push(s,e1);break;case 7:pop(s,e2);cout<<"弹出的元素为"<<e2<<endl;break;case 8:if(top(s)!=-1)cout<<"栈顶元素为"<<top(s)<<endl;break;case 9:traverse(s);cout<<endl;break;case 10:cout<<"成功退出"<<endl;exit(0);default:cout<<"输入有误,请重新输入"<<endl;break;			}	}
} 

五、测试结果

                                          图一

                                        图二 

                                        图三

 

                                        图四 

 

                                         图五

                                         图六

                                         图七

                                          图八

                                           图九

                                            图十

                                             图十一

六、总结

        栈是一种操作受限的线性表,虽然操作受限,但是与线性表有点类似,只不过栈的插入和删除都在表尾而已。而我在本文中实现的顺序栈有点类似顺序表。我们也需要注意到顺序栈虽然实现简单,但是其容易发生溢出,在栈满的时候,还要入栈,则会上溢,而在栈空的时候,还要出栈,则会下溢,针对这个问题,我将在下一篇文章的链栈解决这个问题。

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

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

相关文章

JDK21发布了!面试官:来,谈下jdk21的新特性!

1.前言 JDK21 计划23年9月19日正式发布&#xff0c;尽管一直以来都是“版随意出&#xff0c;换 8 算我输”&#xff0c;但这么多年这么多版本的折腾&#xff0c;若是之前的 LTS 版本JDK17你还觉得不错&#xff0c;那 JDK21还是有必要关注一下&#xff0c;因为会有一批重要更新…

华清远见嵌入式学习——C++——作业一

作业要求&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;int main() {string str;cout << "请输入一个字符串&#xff1a;" << endl;getline(cin,str);int dx0,xx0,sz0,kg0,qt0;int len str.size() 1;for(int i0;i<l…

HarmonyOS 传感器开发指南

HarmonyOS 系统传感器是应用访问底层硬件传感器的一种设备抽象概念。开发者根据传感器提供的Sensor接口&#xff0c;可以查询设备上的传感器&#xff0c;订阅传感器数据&#xff0c;并根据传感器数据定制相应的算法开发各类应用&#xff0c;比如指南针、运动健康、游戏等。 运作…

Centos 如何判断分区是mbr还是gpt格式

1 介绍 MBR 自20世纪80年代初以来的标准分区表格式每个驱动器最多支持四个主分区最多可以划分2TB的磁盘 GPT GPT是MBR分区表格式的后续每个驱动器最多支持128个分区可以将一个磁盘分区到最大到18艾字节 对小于2TB的磁盘使用MBR对大于2TB的磁盘使用GTP 2 查询方式 2.1 fdis…

校园虚拟化部署与横向扩展统一存储

项目背景 这所隶属教育部直属重点大学&#xff0c;学校设有11个学科体系&#xff0c;现有本硕博学生共29000余人&#xff0c;为积极响应“中国教育现代化2023战略部署”&#xff0c;校方制定教育信息化2.0发展目标&#xff0c;通过平台融合&#xff0c;数据驱动、技术赋能等措…

Linux常见指令基础知识

目录 初始Linux操作系统 Linux背景&#xff1a; 开源 &#xff1a; 发行版本&#xff1a; ​编辑 OS概念&#xff0c;定位&#xff1a; 使用 XShell 远程登录 Linux Linux相关知识 文件是什么&#xff1f; 路径分隔符 &#xff08;.&#xff09; 和 &#xff08;. .&…

Docker Swarm总结+Jenkins安装配置与集成(5/5)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

反射、枚举以及lambda表达式

1. 反射 1.1 定义 java的.class文件在运行时会被编译为一个Class对象&#xff0c;既然是对象&#xff0c;那么我们就可以通过一定的方式取到这个对象&#xff0c;然后对于这个对象进行一系列操作&#xff08;改变原本类的属性、方法&#xff09;。 这个操作就是反射&#xf…

数据仓库建模下篇

在实际业务中&#xff0c;给了我们一堆数据&#xff0c;我们怎么拿这些数据进行数仓建设呢&#xff0c;数仓工具箱作者根据自身多年的实际业务经验&#xff0c;给我们总结了如下四步。 数仓工具箱中的维度建模四步走&#xff1a; 维度建模四步走 这四步是环环相扣&#xff0c…

JOSEF 可调漏电继电器 RT-L1KS φ25mm 导轨或面板安装

RT-L系列可调漏电继电器&#xff08;以下简称继电器&#xff09;适用于交流电压至690V&#xff0c;频率为50Hz&#xff0c;电流至1500A及以下漏电继电器中性点接地电路中。 RT-L系列可调型漏电继电器 RT-L1K可调型漏电继电器 RT-L2K可调型漏电继电器 RT-L3K可调型漏电继电器…

Mybaits-plus的使用

MybatisPlus特性 润物无声&#xff1a; 只做增强不做改变&#xff0c;引入它不会对现有工程产生改变&#xff0c;如丝般顺滑。 效率至上 只需简单配置&#xff0c;即可快速进行单表CRUD操作&#xff0c;从而节省大量时间。 使用MybatisPlus依赖基本步骤 引入MybatisPlus依…

echarts点击事件

有这么个需求要点击叶片的时候跳转页面 代码&#xff1a;点击之后 报错了 解决办法 1、使用箭头函数&#xff08;箭头函数没有自己的 this&#xff0c;所以在箭头函数中使用 this 时&#xff0c;其指向与外层作用域相同。&#xff09;或者使用闭包来解决上下文的问题。 2、使…

微信可以添加多少好友?

不知道有没有小伙伴好奇&#xff0c;微信到底可以添加多少好友&#xff1f;正好这个话题也上热搜了&#xff0c;我们就来了解一下。 有网友表示&#xff0c;自己的微信好友数量有10004个&#xff0c;已经不能再添加新的微信好友了。 一个微信号&#xff0c;可以添加的好友上限…

初识Linux(2).妈妈再也不用担心我Linux找不到门了。

文章目录 前言 1.man指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a; 2.cp指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a;把123.txt复制到a目录中类似window如下操作&#xff1a; 3.mv例如&#xff1a;类似window如下操作&#xff1a; 4.nano例…

算法效率的度量

算法效率的度量通常是通过时间复杂度和空间复杂度来描述的。 一、时间复杂度 算法中所有语句的执行次数之和为T(n)&#xff0c;它是算法问题规模n的函数&#xff0c;时间复杂度主要分析T(n)的数量级。 分类 1. 最好时间复杂度&#xff1a;最好情况下&#xff0c;算法的时间…

山西临县“5·7”火灾事故调查报告公布,揭秘富维烟火报警系统

近日&#xff0c;山西临县“57”火灾事故调查报告震惊全国&#xff0c;提醒我们火灾防控的重要性。在这起悲剧中&#xff0c;我们深刻认识到&#xff0c;及时发现火灾并迅速应对至关重要。这不仅是对生命安全的保护&#xff0c;也是对财产损失的有效减少。而在这方面&#xff0…

sCrypt 现已支持各类主流前端框架

sCrypt 现已支持各类主流前端框架&#xff0c;包括&#xff1a; ReactNext.jsAngularSvelteVue 3.x or 2.x bundled with Vite or Webpack 通过在这些支持的前端框架中集成sCrypt开发环境&#xff0c;你可以直接在前端项目里访问合约实例和调用合约&#xff0c;方便用户使用Se…

UE5 - 虚幻引擎各模块流程图

来自虚幻官方的一些资料&#xff0c;分享一下&#xff1b; 一些模块的流程图&#xff0c;比如动画模块&#xff1a; 或角色相关流程&#xff1a; 由于图片比较大&#xff0c;上传到了网络&#xff0c;可自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BQ2KiuP08c…

【JavaScript】alert的使用方法 | 超详细

alert作用效果 alert&#xff08;&#xff09;方法用于显示带有一条指定消息和一个确认的按钮的警告框。 alert使用方法 方法一&#xff1a;直接写在script标签内 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

Docker Swarm总结+基础、集群搭建维护、安全以及集群容灾(1/5)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…