数据结构第三章,栈队列数组,期末不挂科指南,第3篇

掌握栈、队列的顺序存储结构和链式存储结构

掌握栈、队列的基本操作在顺序存储结构和链式存储结构上的实现

掌握矩阵的压缩存储

今天核心咱们先把栈搞清楚

栈和队列可以看做是特殊的线性表。它们的特殊性表现在它们的基本运算是线性表运算的子集,它们是运算受限的线性表

栈(Stack)是运算受限的线性表,这种线性表上的插入和删除操作限定在表的一端进行

栈顶:允许插入和删除的一端栈尾:另一端空栈:不含任何数据元素的栈栈顶元素:处于栈顶位置的数据元素

书中的例子比较形象

洗盘子,放盘子,每次只能从这一摞盘子的最上面拿走,这就是栈的基本操作

看重点:栈—>==后进先出(LastInFirstOut)LIFO原则==

所以栈被称作后进先出线性表(后进先出表)

栈的插入和删除运算分为成为进栈和出栈

这里面有两个小知识点在写代码之前需要掌握

空栈做出栈操作,会出现问题,叫做“下溢”满栈做进栈操作,会出现问题,叫做“上溢”

接下来我们就用C语言实现一下

初始化一个空栈

初始化需要动态分配空间,并且需要让top值等于0

判断栈空

//判断栈空intempty(Seqs){printf("判断栈空n");if(s.top==0){return1;}return0;}这个比较简单了,只需要判断s.top值就可以了

进栈操作

//进栈操作Seqpush(Seqs,intx){printf("进栈操作n");//判断栈是否满了if(s.top==maxsize-1){printf("栈满");returns;}else{printf("正在插入数据%dn",x);s.data[s.top]=x;s.top++;returns;}}出栈操作

//出栈操作Seqpop(Seqs,int*e){if(empty(s)){printf("栈空n");exit(0);}else{*e=s.data[s.top-1];s.top--;returns;}}进栈和出栈,这部分内容一定要好好的理解,其实也是比较简单的,就是添加元素和删除元素

打印栈中元素与获取栈顶元素

//打印栈中元素voiddisplay(Seqs){if(empty(s)){printf("栈空n");exit(0);}else{printf("开始打印n");intnum=0;while(num

intmain(){printf("代码运行中n");Seqs;s=init(s);//插入两个元素s=push(s,1);s=push(s,2);display(s);inte;s=pop(s,&e);printf("删除的元素是:%dn",e);display(s);return0;}双栈书中还提到了双栈,不过这个不是重点了,你要知道的是,双栈的两个栈底分别设置在数组的两端,栈顶分为是top1,top2

两个栈顶在中间相遇,条件为(top1+1=top2)发生上溢

判断栈空条件呢?一个是top=0另一个是top=maxsize-1这个要注意一下即可

栈的链接实现称为链栈。链栈可以用带头结点的单链表来实现,链栈不用预先考虑容量的大小

链栈将链表头部作为栈顶的一端,可以避免在实现数据“入栈”和“出栈”操作时做大量遍历链表的耗时操作

链表的头部作为栈顶,有如下的好处

结论:链表实际上就是一个只能采用头插法插入或删除的链表

例子:将元素1,2,3,4依次入栈,等价于将各元素采用头插法依次添加到链表中

完整代码如下

由于比较简单,直接贴上了

#include#includetypedefstructnode{intdata;//数据域structnode*next;//链域}LkStk;//初始化voidinit(LkStk*ls){printf("初始化操作n");ls=(LkStk*)malloc(sizeof(LkStk));ls->next=NULL;}//进栈voidpush(LkStk*ls,intx){printf("进栈操作n");LkStk*temp;temp=(LkStk*)malloc(sizeof(LkStk));//给temp新申请一块空间temp->data=x;temp->next=ls->next;ls->next=temp;printf("%d进栈成功n",x);}intempty(LkStk*ls){if(ls->next==NULL){return1;}elsereturn0;}//出栈intpop(LkStk*ls){LkStk*temp;//判断栈是否为空if(!empty(ls)){temp=ls->next;//准备出栈的元素指向ls的下一结点ls->next=temp->next;//原栈顶的下一个结点称为新的栈顶printf("栈顶元素:%dn",temp->data);free(temp);//释放原栈顶的结点空间return1;}return0;}intmain(){LkStkls;init(&ls);push(&ls,1);push(&ls,2);pop(&ls);pop(&ls);return0;}这就是链栈的基本进栈和出栈了,当然,我们还可以获取一下栈顶元素

在自考或者期末考试中,容易出现的一种题是手写入栈和出栈例如

设一个链栈的输入序列为A、B、C,试写出所得到的所有可能的输出序列,即输出出栈操作的数据元素序列

写答案的时候,记住先进后出原则

从A开始写A进,A出,B进,B出,C进,C出A进,B进,B出,C进,C出,A出……继续写下去就可以了,一定不要出现A进,B进,B出,C进,A出注意,A出不去,A前面有C呢

在来一个例题

这个就是把A开头和B开头的都写出来

主要仔细,就能写对,套路就是,先进后出

栈是只能在一端(栈顶)进行插入和删除运算的线性表,具有后进先出特征。

以顺序存储结构实现的栈称为顺序栈,以链式存储结构实现的栈称为链栈。

顺序栈需要预先定义栈的大小,在难以估计栈的大小时,可以采用链栈,链栈是用单链表实现。一般地,将栈顶设在链表的表头一端,栈底设置在链表的表尾。栈适合与具有后进先出特征的问题。

THE END
1.数据结构经典题目—两个队列实现栈与两个栈实现队列将一个栈当作输入栈,用于压入push 传入的数据;另一个栈当作输出栈,用于 pop操作。每次 pop 时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。若不为空,则只有将所有输出栈的数据都pop完后,才将输入栈的数据弹入输出栈。再对输出栈进行...https://developer.aliyun.com/article/1336825
2....10在循环队列中用数组A[0..m数据结构 10、在循环队列中用数组A[0..m-1] 存放队列元素,其队头和队尾指针分别为front和rear,则当前队列中的元素个数是( ).A ( front - rear + 1) % m \x05\x05 B ( rear - front + 1) % mC ( front - rear + m) % m\https://www.zybang.com/question/0d4ec37165be699e4a461d50c58d7b1b.html
3.2022年三季度“云南好人”昆明市候选人推荐公示临危受命 他义无反顾率队进入隔离病区 “最短时间内组建人工肺重症医学团队,带上设备和耗材马上去云南省传染病医院抢救危重型新冠肺炎患者。”李志伟是云南省首例成功开展人工肺技术(以下简称ECMO)的人,带领的团队是云南省内ECMO完成数最多的,且存活率接近国内及国际先进水平,他的团队也是云南省首例成功运用人工肺辅助...http://km.wenming.cn/gsgg/202207/t20220722_7722328.html
1.数据结构栈和队列1.1什么是栈 只允许在固定的一端进行插入和删除元素操作的特殊线性表,数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。 如果是两个栈(一个空,一个非空)来进行交换数据的话,特点是“倒进去”---刷题很大用处 ...https://blog.csdn.net/2301_80176093/article/details/143090437
2.android栈和队列的区别mob64ca12e0c608的技术博客在学习Android开发的过程中,理解数据结构的概念尤为重要。栈(Stack)和队列(Queue)是两种基本的数据结构,它们在数据存储和访问方式上有显著的区别。本文将通过一个详细的过程来帮助你理解这两者之间的不同之处。 流程概述 我们将通过以下步骤来探讨栈和队列的区别: ...https://blog.51cto.com/u_16213366/12573836
3.栈与队列(详解)队列循环的要点: 下标往后移动rear与front移动都不能直接+1,都会有从末尾到0的时候 所以向前的代码: (rear+1)%数组长度 (front+1)%数组长度 三、队列与栈的区别 队列:数据是一端入队,另一端出队 原则:先入先出 栈:数据一端入栈,同一端出栈 原则:先入后出...https://yundeesoft.com/109674.html
4.c语言数据结构之栈和队列详解(Stack&Queue)C语言InitStack(&S):初始化一个空栈S。StackEmpty(S):判断一个栈是否为空,若栈为空则返回true,否则返回false。Push(&S, x):进栈(栈的插入操作),若栈S未满,则将x加入使之成为新栈顶。Pop(&S, &x):出栈(栈的删除操作),若栈S非空,则弹出栈顶元素,并用x返回。https://www.jb51.net/article/261165.htm
5.数据结构之栈与队列(优先队列/堆)腾讯云开发者社区此外,针对队列这一特殊数据结构,有时需考虑队列元素的优先级的关系,即根据用户自定义的优先级排序,出队时优先弹出优先级更高(低)的元素,优先队列能更好地满足实际问题中的需求,而在优先队列的各种实现中,堆是一种最高效的数据结构。本文分别介绍了顺序栈、链式栈、链式队列和循环队列以及对应与前两种队列实现的最...https://cloud.tencent.com/developer/article/1173781
6.设数组q[M](M等于6)存储一个循环队,first和last分别是首尾指针...E. 编制财务报表,反映企业的财务状况和经营成果以及资金状况 查看完整题目与答案 【简答题】策划-实施-检查-改进循环请描述应用于整个体系的情况 查看完整题目与答案 【单选题】a、b、c、d、e、f依次进栈、进栈、出栈、进栈、进栈、出栈、进栈的操作,则操作完后,栈S的栈顶元素为()。 A. a ...https://www.shuashuati.com/ti/44dd5c803f81409791a3b64f6ed050a3.html
7.2016年计算机二级考试MSOffice题库及答案A) 在带链队列中,队头指针和队尾指针都是在动态变化的 √B) 在带链栈中,栈顶指针和栈底指针都是在动态变化的 C) 在带链栈中,栈顶指针是在动态变化的,但栈底指针是不变的 75、设数据元素的集合D={ 1,2,3,4,5 },则满足下列关系R的数据结构中为线性结构的是 ...http://edu.yjbys.com/jisuanjidengji/67935_2.html
8.全国自考(数据结构)模拟试卷9自考5. 设数组A[0,m]作为循环队列sq的存储空间,front为队头指针,rear为队尾指针,则执行入队操作的语句是( ) A.sq.front=(sq.front+1)%m B.sq.front=(sq.front+1)%(m+1) C.sq.rear=(sq.rear+1)%m D.sq.rear=(sq.rear+1)%(m+1) https://www.educity.cn/zikao/68954.html
9.最好的旅行方式,大多数中国人都错过了澎湃号·湃客澎湃新闻中国蓝天救援高山救援队队长安少华参加过近百次户外运动遇险救援。他发现:“很多户外的悲剧,都是对风险点和难度估计不足,高估了自己的能力,贸然涉险而至”。 △救援队救助户外登山者的消息/新浪微博 不可否认,受都市文明庇护已久的人类,对自然,以及人类在自然中的生存能力实际非常陌生。 https://www.thepaper.cn/newsDetail_forward_9487804
10.政策入耳更入脑干啥心里都有底从产业兴旺到乡风文明,从基层治理到脱贫攻坚,从田间到社区,从“兜兜队”到“婆婆嘴”,马祖镇十九大精神宣讲热气腾腾。马祖镇党委书记廖皎介绍,宣传队成员都是来自各村土生土长的村民和干部。宣传队成立后,全镇还统一组织了培训。“用身边人来宣传,更接地气,也更易于被老百姓接受。”廖皎说。 http://www.gcdr.gov.cn/content.html?id=29998
11.银河护卫队2六级影迷官方指定辅导手册(银河护卫队2)影评星爵到哪都是戏,Vol.1中没能和卡魔拉跳舞,Vol.2继续撩,能不能展开一段恋情,还得看这两个人的心情。 预告 传说中的亲爹终于登场,一边认女票,一边认亲爹, 第二部星爵有点忙。 预告 >>>人气天团填新人 银河护卫队由原来的5人增加为8人,而且还有新角色加入,新人气质符不符合,飙次车就知道。 预告...https://movie.douban.com/review/8513166
12.阿拉贡魔戒中文维基灰机wiki[7]此后,数批斥候被派向各地,他们要将幽谷方圆百里都侦察个一干二净。阿拉贡和埃尔隆德的双生子也在其中。霍比特人在幽谷呆了将近两个月,斥候才一批一批地返回。于是,埃尔隆德与甘道夫确定了护戒远征队的九名成员,他们是:弗罗多·巴金斯、山姆怀斯·甘姆吉、甘道夫、阿拉贡、梅里阿道克·白兰地鹿、佩里格林·图克、...https://lotr.huijiwiki.com/index.php?curid=1611