1.本周学习总结

栈:只能在表的一端进行插入删除等操作,是一种先进后出的线性表,具有先进后出结构的题都可以用栈来实现,比如表达式求解,字符串匹配,进制转换等等;队列:特点是在表的一端插入另一端删除,是先进先出的线性表,舞伴问题,迷宫求解等问题以及以后与树的结合都可以用队列实现。我认为栈和队列看起来简单,但其实也有复杂的地方:我最容易弄混的就是栈空栈满队空队满的条件有时是在特殊的栈和队列中。还有一些这方面的难题,需要我去思考。

2.PTA实验作业

2.1题目一:舞伴问题

2.1.1代码截图



2.1.2提交列表


Q1:刚刚看到题目有点蒙没有思路,这是两个队列,男女分开吗,这要怎么写?
A1:后来发现入队出队的操作一样,唯一不同的是舞伴配对的函数。
Q2:前面的函数都很正常,就是配对舞伴那里出现了答案错误。
A2:原因是入队出队的过程还不熟练,再加上需要用到前面写的函数,我就答案错误了。
Q3:还是这个函数。
A3:我没有仔细看主函数,把输出写到函数里面了。

2.2题目二:在一个数组中实现两个堆栈

2.2.1代码截图


2.2.2提交列表


Q1:在第一个初始化的函数中,我对malloc不太了解,不记得前后两个括号要放啥进去。
A1:询问了同学,知道前面返回一个指针,后面用sizeof求出长度,并且要对top1,top2,maxsize初始化。
Q2:入栈和出栈函数不正确。
A2:有两个栈,用if-else嵌套是怎么分类就不是很懂,后来想清了思路就好了。

2.3题目三:银行业务队列简单模拟

2.3.1设计思路

   首先定义两个队列a,b用来表示AB窗口,flag,sign判断,num表示人数,code表示顾客编号。
   第一步按照人数输入编号,并根据奇偶进入A或B队列,让他们入队(如果只有一个人,输出编号即可)。

下一步进行输出操作:当A和B队列都不为空时,用flag表示是否为第一个,要是flag=0就将flag==1,输出栈头让它出栈,输出空格,在输出下一个栈头再让他出栈,否则就是输出空格再输出栈元素。
用sign来表示速度,看A窗口是否处理完了两个人,sign=0表示A已经处理完了两个人。要输出空格和B栈头,将sign置为1,继续上述操作。

2.3.2代码截图



2.3.3提交列表


Q1:编译错误?
A1:因为第一开始我就不太习惯用flag,这次需要两个判断的标识flag和sign,我就有点不会用,flag乱用就会出现编译错误啊答案错误啊运行超时等问题,想明白就好了,然后理清思路就会清楚很多。

2.4题目四: 符号配对 :请编写程序检查C语言源程序中下列符号是否配对://、(与)、[与]、{与}。

2.4.1设计思路

2.4.2代码截图




2.4.3提交列表


Q1:编译错误第一次!
A1:我用stack还不熟练,经常用错,再加上我也不会用字符相关的东西。
Q2:编译错误第二次!
A2:对于栈的操作不熟练,老是在语法和出栈入栈的地方出错。
Q3:编译错误第三次!
A3:这个题跟之前的那个字符配对不一样,有了//的对称,我就完全没思路不会操作了,嘤嘤嘤。

3.栈和队列上机考试

3.1错误题目1:jmu-ds-表达式求解

3.1.1错误代码截图

3.1.2错误原因及体会

 因为本身对栈的操作没有那么熟练而且也没有好好看书,这个题书上应该有很类似的代码,但是我一到上机考的时候脑子一片空白,就只记得思路是输入字符串,遍历,遇到括号就进栈,遇到其他的跳过,在碰到括号出栈这样的,脑子一片空白,然后考试的时候就只打了一个switch case,语法也不太对,归根到底还是操作不熟练,平时代码量不够。
 正确代码应是:




3.2错误题目:jmu-报数游戏

3.2.1错误代码截图

3.2.2错误原因及分析

 这是一个关于队列的问题,老师上课的时候有讲过,但是我没特别认真听,只记得了个大概思路,用队列出队等等。考试碰上了就蒙了立刻放弃,现在补回来,

以下是舍友教我的正确代码:



思路是这样的:
定义m表示退出位数,n表示人数并输入
if(m大于等于n)
输出错误提示
定义i用于循环和编号,k用于循环
定义队qu,数组out
for(i从1到n依次递增)
让i进队
定义flag=0用于判断
定义front表示队首
while(队不为空)
{
if(flag等于1)
i等于1
flag等于0
if(i小于m)
front等于队首
出栈,进栈
i加一
if(i等于m)
out[k++]=队首
出栈
flag=1
for(i从0到n递增)
按照输出格式输出