数据结构:顺序栈

文章目录

        • 栈:
        • 顺序栈的实现及操作:
          • 1.定义一个栈
          • 2.构造一个空栈
          • 3.取栈顶元素
          • 4.插入元素e
          • 5.删除栈顶元素,返回其值
          • 6.清空栈,销毁栈
        • 栈的操作实例及代码:

栈:

从数据结构上来看,栈也是线性表,但是是操作受限的线性表。

栈是限定仅在表尾进行插入或删除操作的线性表。

对栈来说,表尾端称为栈顶,表头端称为栈底。

栈是后进先出的线性表。

栈的基本操作:在栈顶插入删除,初始化,判空,取栈顶元素等

栈也有两种存储方法,一种是顺序栈,用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。另一种是链栈。这里先整理顺序栈。

顺序栈的实现及操作:

1.定义一个栈

顺序栈的定义完全可以用顺序表的定义,不过这里由于经常要用到栈顶,所以就增加一个top指针,指向栈顶元素的下一个位置。由于当前已存的元素个数length可以由栈顶指针减栈底指针求出,所以,这里就省去length,只保留一个初始化定义时给定的最大存储元素个数stacksize,当使用栈时空间不够,可以再进行扩大。

top指针方便之处,就在于,插入的时候插到top指向的位置上,然后top指针自增。出栈的时候把top指针自减,然后把top指针指向位置的元素取出即可。

#define STACK_INIT_SIZE	100				
#define STACKINCREMENT	10 	
typedef struct
{SElemType_Sq *base;				SElemType_Sq *top;				 int stacksize;					
}SqStack;
2.构造一个空栈

base称为栈底指针,top称为栈顶指针。构造空栈,top指针和base指针指向同一位置,此时栈里面没有元素(length=0)。其他的和构造一个空顺序表一样。

Status InitStack_Sq(SqStack &S)
{S.base = (SElemType_Sq *)malloc(STACK_INIT_SIZE*sizeof(SElemType_Sq));if(!S.base)exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;
} 
3.取栈顶元素

这里取栈顶元素,我们先判断栈是否为空,如果不为空,取栈顶元素。栈顶元素再top指针的上一个位置,也就是S.top - 1(这里可以类比数组,a+1也就是指向a[1]的指针),那么取出的话把地址的值给e即可。注意这里仅仅是取出,不能改变栈顶指针,不能S.top–。

Status GetTop_Sq(SqStack S, SElemType_Sq &e)
{if(S.top==S.base)return ERROR;e = *(S.top - 1);						return OK;
} 
4.插入元素e

之前说了,S.top-S.base就是length当前已存的元素个数,那么如果length=最大存储元素个数stacksize,那么再插入元素的时候就空间不够了,所以这里需要再增加一段新的空间,能够再多存STACKINCREMENT个元素。弄完之后我们的top指针应该指向栈顶元素的下一个位置,此时已经有stacksize个元素了,也就是说,top指针指向S.base + S.stacksize这个位置。(不理解可以类比数组a+stacksize就是&a[stacksize],而a时下标为0开始存元素的,也就是说现在a+stacksize指向的时第stacksize+1个元素的位置)

然后修改完top指针后,stacksize也更新为S.stacksize + STACKINCREMENT。

此时我们先把e赋值到top指针指向的位置,然后top指针指向栈顶元素的下一个位置,自己加一即可。

Status Push_Sq(SqStack &S, SElemType_Sq e)
{if(S.top-S.base>=S.stacksize)		{S.base = (SElemType_Sq *)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(SElemType_Sq));if(!S.base)exit(OVERFLOW);					S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top = e;							S.top++;return OK;
}
5.删除栈顶元素,返回其值

出栈的时候把top指针自减,然后把top指针指向位置的元素取出即可。

Status Pop_Sq(SqStack &S, SElemType_Sq &e)
{if(S.top==S.base)return ERROR;S.top--;									e = *(S.top);return OK;
} 
6.清空栈,销毁栈

清空栈,意味着top指针和base指针指向同一位置。

但是销毁栈,top指针和base指针指向null而且stacksize等于0。

Status DestroyStack_Sq(SqStack &S)
{S.base = NULL;S.top = NULL;S.stacksize = 0;return OK;
} Status ClearStack_Sq(SqStack &S)
{S.top = S.base;return OK;
} 

栈的操作实例及代码:

代码:

#include<cstdio>
#include<cstdlib>#define STACK_INIT_SIZE	100				
#define STACKINCREMENT	10 	#define	OK			1			
#define	ERROR		0	
#define	OVERFLOW	-2			
#define UNDERFLOW	-3	
#define	TRUE		1			
#define	FALSE		0
typedef int Status;
typedef int SElemType_Sq;typedef struct
{SElemType_Sq *base;				SElemType_Sq *top;				 int stacksize;					
}SqStack;Status InitStack_Sq(SqStack &S)
{S.base = (SElemType_Sq *)malloc(STACK_INIT_SIZE*sizeof(SElemType_Sq));if(!S.base)exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;
} Status GetTop_Sq(SqStack S, SElemType_Sq &e)
{if(S.top==S.base)return ERROR;e = *(S.top - 1);						return OK;} Status Push_Sq(SqStack &S, SElemType_Sq e)
{if(S.top-S.base>=S.stacksize)		{S.base = (SElemType_Sq *)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(SElemType_Sq));if(!S.base)exit(OVERFLOW);					S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top = e;							S.top++;return OK;
} Status Pop_Sq(SqStack &S, SElemType_Sq &e)
{if(S.top==S.base)return ERROR;S.top--;									e = *S.top;return OK;
} 
void PrintElem(SElemType_Sq e)
{printf("%d ", e);
}
Status StackTraverse_Sq(SqStack S, void(Visit)(SElemType_Sq))
{												 SElemType_Sq *p = S.base;while(p<S.top)Visit(*p++);printf("\n");return OK;
} 
Status StackEmpty_Sq(SqStack S)
{if(S.top==S.base)return TRUE;elsereturn FALSE;
} int main(){SqStack S;int i;SElemType_Sq e;printf("初始化顺序栈 S ...\n");					 		InitStack_Sq(S);printf("\n");StackEmpty_Sq(S) ? printf(" S 为空!!\n") : printf(" S 不为空!\n");printf("\n");for(i=1; i<=6; i++)									{printf("将 \"%2d\" 压入栈 S \n", 2*i);			Push_Sq(S, 2*i);}printf("\n");printf(" S 中的元素为:S = ");						 StackTraverse_Sq(S, PrintElem);printf("\n");Pop_Sq(S, e);printf("栈顶元素 \"%d\" 出栈...\n", e);printf(" S 中的元素为:S = ");						 StackTraverse_Sq(S, PrintElem);printf("\n");GetTop_Sq(S, e);printf("栈顶元素的值为 \"%d\" \n", e);printf("\n");}

运行结果:

初始化顺序栈 S …

S 为空!!

将 " 2" 压入栈 S
将 " 4" 压入栈 S
将 " 6" 压入栈 S
将 " 8" 压入栈 S
将 “10” 压入栈 S
将 “12” 压入栈 S

S 中的元素为:S = 2 4 6 8 10 12

栈顶元素 “12” 出栈…
S 中的元素为:S = 2 4 6 8 10

栈顶元素的值为 “10”

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

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

相关文章

计算机二级考试开考多久能出来,【计算机二级】明天就要开考了,你们准备好了吗?...

原标题&#xff1a;【计算机二级】明天就要开考了&#xff0c;你们准备好了吗&#xff1f;计算机二级考试马上要来了现在距离考试只有不到几个小时的时间了不知道各位同学准备的怎么样了呢&#xff1f;人有多大胆&#xff0c;复习拖多晚但这可不是什么好习惯奔赴“战场”之前先…

mysql面试题 高级_高级MySQL数据库面试问题 附答案

mysql -u USER_NAME -xml -e SELECT * FROM table_name > table_name.xml上面的例子中USER_NAME是数据库的用户名&#xff0c;table_name是待导出为xml文件的表名&#xff0c;table_name.xml是存放数据的xml文件9. MySQL_pconnect是什么? 它和MySQL_connect有什么区别?答&…

办公室中有一台计算机连接打印机,办公室就一个打印机,怎么让多个电脑一起用...

中小型企业的办公室一般只配一台打印机&#xff0c;每次打印东西都要把文件拷在U盘再转到连接打印机的那台电脑&#xff0c;很麻烦。那么怎么才能实现打印机多台电脑共享呢&#xff1f;以下把连接打印机的电脑成为“主电脑”&#xff0c;把需要的共享的电脑叫“客电脑”。1.设置…

数据结构:单链队列

文章目录队列&#xff1a;单链队列的实现及操作&#xff1a;1.定义一个队列2.构造一个空队列3.销毁队列4.插入元素e到队尾5.删除队头元素&#xff0c;用e返回其值单链队列操作实例及代码&#xff1a;队列&#xff1a; 队列是先进先出的线性表。 队列只允许在表的一端插入元素…

php修改mysql数据找不到_php 如何修改mysql数据

PHP MYSQL 修改删除数据创建userinfo_update.php&#xff0c;用于查询用户信息&#xff0c;先显示信息&#xff0c;在修改&#xff1a;先通过GET获取用户编号查询用户信息&#xff1a;$sql "select * from user_info where user_id".$_GET[userId]."";$re…

人工智能训练机器人的服务器,人工智能系统教会机器人如何在荒野中行走

对救援人员和户外运动爱好者来说&#xff0c;穿越荒野小径是一项有用的技能&#xff0c;但对机器人来说却很难。这并不是说这些机械动物没有能力在爬上山坡的同时避开倒下的树枝——最先进的机器学习算法可以做到这一点。问题在于它们缺乏通用性&#xff1a;人工智能驱动的机器…

(递归)猴子吃桃

题目&#xff1a; 猴子买一堆桃不知个数&#xff0c;每天吃桃子一半多一个&#xff0c;第n天只剩一个桃&#xff0c;问一开始买了几个桃。输入整数n(2<n<30)。输出买的桃的数量。 样例输入2&#xff0c;输出4。 样例输入3&#xff0c;输出10。 分析与解答&#xff1a; …

世界手机号码格式_脑炎康复之旅——世界脑炎日病友征文

○○脑炎康复之旅世界脑炎日病友征文2月22日是世界脑炎日(World Encephalitis Day)。2014年发起的世界脑炎日旨在致敬和鼓励全世界经历过脑炎的患者和脑炎医疗工作者。几年来&#xff0c;全球已有1.87亿人次参与世界脑炎日活动。2021年的世界脑炎日即将到来&#xff0c;今年世界…

pythoni手机版下载_Python进度栏和下载

已更新您的示例网址&#xff1a;我刚刚为此编写了一种超级简单的方法(将其略微修改)&#xff0c;以将pdfs刮出某个站点。 请注意&#xff0c;由于Powershell无法处理“ \ r”&#xff0c;因此只能在基于UNIX的系统(Linux&#xff0c;Mac OS)上正常运行import requestslink &qu…

(递归)斐波那契数列

题目 f1f21,fnafn−1bfn−2(n>2)f1f21,f_naf_{n-1}bf_{n-2}(n>2)f1f21,fn​afn−1​bfn−2​(n>2) 输入包含四个整数n(1≤n≤100),a(1≤a≤10),b(1≤a≤10),p((1≤a≤2000)。n(1\leq n \leq 100),a(1\leq a \leq 10),b(1\leq a \leq 10),p((1\leq a \leq 2000)。n(1≤…

树莓派和微信和服务器,用树莓派搭建微信公共平台

1、首先你需要一个公网ip&#xff0c; 需要做好映射&#xff0c; 把80端口映射到你的树莓派ip。2、打开你的树莓派终端&#xff0c; 创建文件夹“templates ” 和文件“weixind.py”。3、文件“weixind.py”中写入以下代码。安装“sudo apt-get install python-lxml”。5、申请…

mysql数据异常增长_mysql表到一定数据量后会异常的增长

如题InnoDB的table&#xff0c;里面的字段非常简单&#xff0c;如图中的类型才100多W的数据量&#xff0c;数据是慢慢积累起来的&#xff0c;到了最近发现涨到12G后&#xff0c;会每天成倍的增长&#xff0c;最高到达过50G&#xff0c;而数据量还是那些&#xff0c;longtext的字…

(递归)快速幂

题目 xyx^yxy当y很大&#xff0c;采用如下方式 {f(x,y2)f(x,y2),(y%20,y>0)1,y0f(x,y2)f(x,y2)x,(y%21,y>0)\left\{\begin{matrix} &amp; f(x,\frac{y}{2})\times f(x,\frac{y}{2}),(y\%20,y>0)\\ &amp; 1,y0\\ &amp; f(x,\frac{y}{2})\times f(x,\frac{y…

舰r4月28服务器维护,崩坏3 11月28日版本更新维护通知

亲爱的舰长&#xff1a;为了给舰长更好的游戏体验&#xff0c;休伯利安号将在11月28日进行版本更新维护&#xff0c;维护完成后战舰将更新为3.6版本——「绯夜霞隐」。维护时间安卓国服、iOS服和各渠道服&#xff1a;11月28日07:00~12:00全平台服(桌面服)&#xff1a;11月28日0…

ec200s 方案 移远_移远 4G Cat 1 无线通信模块EC200S

EC200S 是移远通信最近推出的LTE Cat 1 无线通信模块&#xff0c;支持最大下行速率10Mbps 和最大上行速率5Mbps&#xff0c;具有超高的性价比&#xff1b;同时在封装上兼容移远通信多网络制式LTE Standard EC2x(EC25、EC21、EC20 R2.0、EC20 R2.1)和EC200T/EG25-G/EG21-G 模块以…

(递归)弹簧板

题目 现在n个弹簧板&#xff0c;小球从第i个弹簧板落下&#xff0c;可以向前弹a[i-1]个距离或者b[i-1]个距离&#xff0c;现在从第一个弹簧板落下&#xff0c;计算弹多少次&#xff0c;弹出弹簧板。(1≤n≤200),(0<a[i],b[i]≤30)(1 \leq n \leq 200),(0 < a[i],b[i]\le…

maven 打包时缺少文件_maven父子工程---子模块相互依赖打包时所遇到的问题:依赖的程序包找不到...

场景:因为之前用到的是,基于springboot框架所搭建的maven工程,而且都是相互独立的。现研发经理要求将所有工程进行整合和规范化,所以抽出一个parent父工程,base基础模块(包含一些公用的实体类和工具类等),以及其他子模块(Module A、 Module B …)。Module A 以及Module B工程都…

(递归)最大公约数

题目&#xff1a; f(x,y)f(x,y)f(x,y){f(y,x%y),(y>0)x,(y0)\left\{\begin{matrix} &amp; f(y,x\% y),(y>0) \\ &amp; x,(y0) \end{matrix}\right.{​f(y,x%y),(y>0)x,(y0)​ 输入&#xff1a;第一行一个整数t(t ≤100\leq 100≤100)然后有t行&#xff0c;每行…

mysql c语言数字转字符串函数_C++_c语言标准库中字符转换函数和数字转换函数,字符转换为数字: #includest - phpStudy...

c语言标准库中字符转换函数和数字转换函数字符转换为数字&#xff1a;#includeatoi();将字符转换为整型 例&#xff1a;char ch1;int iatoi(ch1);atol();将字符转化为长整型 例&#xff1a;char ch2;long latol(ch2);atof();将字符转化为浮点型 例&#xff1a;char ch3;flo…

(栈)括号匹配

题目 一个串&#xff0c;只包含(和)。一个(能唯一匹配一个)&#xff0c;但是(必须出现在)之前&#xff0c;请判断括号能否完全匹配&#xff0c;如果能&#xff0c;输出配对的括号位置&#xff0c;匹配括号只能嵌套不能交叉。 输入&#xff1a;一个只由(和)构成的字符串&#…