DS博客作业02栈和队列不会soma

当你用浏览器上网时,不管什么浏览器都有一个“后退”键,你点击后可以按访问顺序的逆序加载浏览过的网页。即使你从一个网页开始,连续点了几十个链接跳转,你点“后退”时,还是可以像历史倒退一样,回到之前浏览过的某个页面。又或者你在word里面快乐地写论文的时候,一不小心将一整段内容删除了,这个时候不要慌,我们可以点Ctrl+z,撤销之前的删除操作。这就是栈在现实生活之中的应用栈是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的找称为空栈。栈是一种后进先出的线性表。

既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们将其简称为顺序栈。

/*插入元素e为新的栈顶元素*/StatusPush(SqStack*S,SElemTypee){if(S->top==MAXSIZE-1)/*栈满*/{returnERROR;}S->top++; /*栈顶指针增加一*/S->data[S->top]=e;/*将新插入元素赋值给栈顶空间*/returnOK;}(2)顺序栈的出栈操作:进栈是先自增再赋值,出栈则反过来。先把要出栈的元素获取到,然后再指针自减,把空间释放出来。

/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR*/StatusPop(SqStack*S,SElemType*e){if(S->top==-1)returnERROR;*e=S->data[S->top]; /*将要删除的栈顶元素赋值给e*/S->top--; /*栈顶指针减一*/returnOK;}(2)顺序栈的其他操作:

/*构造一个空栈S*/StatusInitStack(SqStack*S){/*S.data=(SElemType*)malloc(MAXSIZE*sizeof(SElemType));*/S->top=-1;returnOK;}/*顺序栈的遍历:从栈底到栈顶依次对栈中每个元素显示*/StatusStackTraverse(SqStackS){inti;i=0;while(i<=S.top){visit(S.data[i++]);}printf("\n");returnOK;}Statusvisit(SElemTypec){printf("%d",c);returnOK;}/*在栈不空的情况下返回栈顶元素并出栈*/StatusPop(SqStack*S,SElemType*e){if(S->top==-1)returnERROR;*e=S->data[S->top]; /*将要删除的栈顶元素赋值给e*/S->top--; /*栈顶指针减一*/returnOK;}(2)链栈:链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。对于链栈来说,一般情况下基本不存在栈满的情况。链栈为空的判断的条件是top=NULL;链栈的结构体定义如下:

typedefintStatus;/*SElemType类型根据实际情况而定,这里假设为int*/typedefintSElemType;/*链栈结构*/typedefstructStackNode{SElemTypedata;structStackNode*next;}StackNode,*LinkStackPtr;typedefstruct{LinkStackPtrtop;intcount;}LinkStack;链栈的操作与对链表的操作基本相同。

/*链栈的进栈操作*/StatusPush(LinkStack*S,SElemTypee){LinkStackPtrs=(LinkStackPtr)malloc(sizeof(StackNode));s->data=e;s->next=S->top; /*把当前的栈顶元素赋值给新结点的直接后继,见图中①*/S->top=s;/*将新的结点s赋值给栈顶指针,见图中②*/S->count++;returnOK;}/*出栈操作*/StatusPop(LinkStack*S,SElemType*e){LinkStackPtrp;if(StackEmpty(*S))returnERROR;*e=S->top->data;p=S->top; /*将栈顶结点赋值给p,见图中①*/S->top=S->top->next;/*使得栈顶指针下移一位,指向后一结点,见图中②*/free(p);/*释放结点p*/S->count--;returnOK;}1.1.2队列:在日常生活中,我们使用电脑的时候。机器有时会处于疑似死机的状态,鼠标怎么点都没用,双击任何快捷方式都不动弹。就当你失去耐心,打算重启时,突然它能动了,把你刚才点击的所有操作全部都按顺序执行了一遍。这其实是因为操作系统中的多个程序因需要通过一个通道输出,而按先后次序排队等待造成的。这就是队列。队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

线性表分为顺序存储和链式存储,栈是线性表,所以也有这两种存储方式。同样,队列作为一种特殊的线性表,也同样存在这两种存储方式。我们一直都是用数组来实现顺序存储的,顺序队列也不例外。所以我们可以定义一个数组intdata[MAXSIZE]来存储队列的元素。另外,我们还需要两个指针,来标记队头和队尾,所以定义如下:

*QElemType类型根据实际情况而定,这里假设为int*/typedefintQElemType;/*循环队列的顺序存储结构*/typedefstruct{ QElemTypedata[MAXSIZE]; intfront; /*头指针*/ intrear; /*尾指针,若队列不空,指向队列尾元素的下一个位置*/}SqQueue;如果队不满,我们就可以入队了。入队的思路就是,先给队尾元素赋值,然后再将队尾指针向后移动一位。比如从空队列开始,此时Q->front==Q->rear,这个时候插入元素的话,其实就是给data[Q->rear]赋值e,然后队尾指针Q->rear向后移动一位重新赋值。虽然我们在定义队列的时候没这个长度变量,但是我们可以通过模计算来取得我们需要的。将队尾指针向后移动一位?很简单,Q->rear=(Q->rear+1)%MAXSIZE;即可。

/*QElemType类型根据实际情况而定,这里假设为int*/typedefintQElemType;typedefstructQNode /*结点结构*/{QElemTypedata;structQNode*next;}QNode,*QueuePtr;typedefstruct /*队列的链表结构*/{QueuePtrfront,rear;/*队头、队尾指针*/}LinkQueue;链队的操作,入队出队,大致思路:(1)我们先创建一个结点s,QueuePtrs=(QueuePtr)malloc(sizeof(QNode));(2)然后给s的data域赋值e,指针域next赋值null。s->data=e;s->next=NULL;目的就是让它成为新任队尾元素。(3)前任队尾元素直接让它的指针域指向s就行了。Q->rear->next=s;(4)别忘了把队尾指针重新指向新任队尾s。Q->rear=s;代码如下:

(1)如图中,要删除掉a1结点,思路很简单,就是让头结点Q->front的后继next直接指向a2。但是a2如何标识呢?(2)假设a1结点为p结点,那么a2就是p->next了。如何让a1结点存到p呢?(3)直接让头结点的后继指向p就行,p=Q->front->next;(4)假如队尾已经是p结点的话(Q->rear==p),队尾指针需要指向头结点Q->rear=Q->front;(5)最后别忘了把pfree掉。

/*若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR*/StatusDeQueue(LinkQueue*Q,QElemType*e){ QueuePtrp; if(Q->front==Q->rear) returnERROR; p=Q->front->next; /*将欲删除的队头结点暂存给p*/ *e=p->data; /*将欲删除的队头结点的值赋值给e*/ Q->front->next=p->next;/*将原队头结点的后继p->next赋值给头结点后继*/ if(Q->rear==p) /*若队头就是队尾,则删除后将rear指向头结点*/ Q->rear=Q->front; free(p); returnOK;}1.2.谈谈你对栈和队列的认识及学习体会。学习栈与链表的时候感觉这两个概念好懂,但是真正做题的时候又十分地抽象,题目通常很长,需要利用栈和容器地性质才能很好的解决问题。所以,这一部分的习题做的不是太好。开学已经近6周了,总是觉得自己的状态不怎么良好。线上教学确实能比现实中上课听得清楚,但是自己需要抵制各种诱惑。还有,最近代码量有点少,所以看见题目会有一种无从下手的感觉。在家确实没有学校氛围好,自己会懈怠的。总而言之,还是看自己,不能步步都跟不上不是吗?努力吧!

选2道PTA题目,不写伪代码,只贴代码截图,并记录代码提交碰到问题及解决方法。不得选栈或队列操作(选,则为0分)选择难度越高题目得分越高。

Q:多种错误;A:开始按着自己的思路写了下来,输出时的格式不正确,导致错误;Q部分正确:A:这次提交过了两个测试点。由于我没有调用函数,直接在main()里面实现,所以代码重复的地方多;当输入的字符串是匹配的时候,可以输出”yes”;但是当栈内仍然存在元素(如测试点”[{“),也会输出”yes”;所以另外加了一个判断条件,判断循环结束时栈是否为空;Q:部分正确;A:起初先判断flag值是否进行了变通,再判断栈是否为空。这样子做,如果flag值被改变,栈为空,那么即会输出yes,也会输出no。所以,将栈空判断放在前面就会解决这个问题。

Q:答案错误;A:开始的时候没看懂题目的意思,以为m%3==1的情况下才进行输出,所以第一次答案错误。在调试中发现了这个问题,所以没有提交;Q:部分正确;A:格式不符合导致的错误。题目要求每一个数字之间要有空格隔开,结尾不能留空格。所以要控制一下输出格式。因为我用的是链队,所以不方便对队尾数字进行操作,所以对第一个数字进行格式控制。刚开始改的时候没有注意第一个数字也要出队,导致输出的数据多了一个。不要忘记判断m与n的大小,m>n时要直接报错。

/*官方解题代码*/voidhanota(vector&A,vector&B,vector&C){intn=A.size();move(n,A,B,C);}voidmove(intn,vector&A,vector&B,vector&C){if(n==1){C.push_back(A.back());A.pop_back();return;}move(n-1,A,C,B);//将A上面n-1个通过C移到BC.push_back(A.back());//将A最后一个移到CA.pop_back();//这时,A空了move(n-1,B,A,C);//将B上面n-1个通过空的A移到C}};3.1.1该题的设计思路解题思路:递归与分治首先我们来回顾一下这个问题。有A,B,C三根柱子,A上面有n个盘子,我们想把A上面的盘子移动到C上,但是要满足以下三个条件:

函数中涉及到的c++知识(1)pair可以理解为包含两个元素的结构体(2)vector>是个长度可变的结构体数组,c++里面称为容器(3)ret_func_typefunc(vector>&name)中的name是vector>容器的引用,可以理解为传入一个指针(4)sort(g.begin(),g.end(),cmp)对容器g的结构体按照cmp的排序规则排序,容器的起始数据的指针是g.begin(),容器的末尾数据的指针是g.end()

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