DS博客作业03--栈和队列
1.本周学习总结(0--1分)
谈谈你对栈和队列结构的认识及学习体会
这几周学习了栈和队列
栈的特点是先进后出,这种特点适合用来将中缀表达式转为后缀表达式,适合用来处理运算符的优先级,这些内容书上都有代码,也有将思路,看着简单,可是实际操作打起代码来好像没有想象的那么简单;
为了最大化栈的利用空间,可以使用共享栈来存储数据,从两边分别进栈向中间伸展,共享栈要注意的是判断栈空和栈满的条件和普通栈不大一样;
队列的特点是先进先出,可以用来处理报数问题之类的,而且有循环队列的操作,这也是为了充分利用队列的空间
栈和队列都可以用来处理迷宫问题,栈用的是深度搜索,找到路径就停止搜索,搜索的速度虽然快但是不是最优解,而队列用的是广度搜索,全部的录路径都会被搜索到,虽然速度慢但是可以找到最优解。
这也说明了栈和队列都有各自的优点,看利用在什么问题上而已
2.PTA实验作业
2.1.题目1:6-1 另类堆栈(函数题)
2.1.1设计思路
进栈
先判断是否栈满
是,返回错误
不是,将数字赋给data的top位置,让top++,返回正确
出栈
先判断是否栈空
是,返回错误
不是,将数值赋给data的top减一的位置,并让top--,返回数值
2.1.2代码截图
2.1.3本题PTA提交列表说明
A1:一开始的部分正确是最小N,最后无输出的测试点过了。因为忘记带书回去了,所以也没有看书,而且GetOp这个函数不大会写,就只能自己疯狂试探了,因为是另类堆栈,和书上的内容好像也不太一样,加上我一直分不清,是应该先自增还是后自增,提交列表就多了
Q1:后来开始打草稿了,因为一开始top为0,所以进栈时,应该先赋值在自增,然后出栈时,因为进栈时,自增了一次,所以出栈的元素应该是top-1,而不是出栈top所在的元素,然后再那top自减,这样就可以正确了
A2:快接近正确时,然后又出现了部分正确,错的测试点是格式错误
Q2:忘记加\n了!!
2.2 题目2:6-11 另类循环队列(函数题)
2.2.1设计思路
入队
如果队满
是,返回错误
不是,将元素赋给data的(count+front)%MaxSize的位置,让count自增,返回正确
出队
如果队空
是,返回错误
不是,将数值赋给data的front,让front循环自增,count自减,返回数值
2.2.2代码截图
2.2.3本题PTA提交列表说明
A1:编译错误,好吧,又是一些低级错误,因为给的函数体有细节不表的函数,就没有放到dev里跑一下了
Q1:根据它给的编译错误提示,轻松就解决了
A2:然后是部分正确,出队和入队都可以解决,但是最后将队列输出时,输出的顺序是错的,因为输出是调用出队这个函数,所以也就没改上一个进队的函数,一直在研究出队的函数,怎么让它输出正确后来实在搞不定了,问了舍友才发现进队函数写的太简单了,只让count自增,对front都没有操作到,这也导致了我输出时的顺序是有问题的
Q2:后来在舍友的帮助下,将代码改了过来。后来自己看了书,发现书上有这个另类队列的解法。好吧,我应该先看看书的!
2.3 题目3:7-4 表达式转换(编程题)
2.3.1设计思路
定义字符串exp,char型的堆栈,char型的队列,变量i,j
输入字符串exp
遍历exp
switch(exp)
case ‘+’,case '-':
while 堆栈不空
if 栈顶不是左括号//因为不是左括号,优先级就比较低,放进队列里等待被输出
将栈顶进队,并且出栈
else break;
end while
将exp[i]进栈,i++,break
case ‘*’,case ‘/’:
while 堆栈不空
if 栈顶不是*或者/
将栈顶进队,并且出栈
else break;
end while
将exp[i]进栈,i++,break
case ‘(’:
将左括号进栈//遍历堆栈时遇到左括号,其后面的运算符的优先级就比较高,可以先进队
i++,break
case ‘)’:
当栈顶不为‘(’
将栈顶进队,出栈
将栈顶出栈//这个时候栈顶为左括号,应该将其出栈
i++,break
default:
while exp[i]为数字字符,将其进队,i++,break
end while
while 堆栈不为空
将栈顶进队,并且出栈
将队列控制格式输出
2.3.2代码截图
2.3.3本题PTA提交列表说明
A1:这题是看着书上的代码写的思路差不多都懂,在dev上运行时,样例时正确的,但是它提示格式错误,emmm,我明明有控制格式输出
Q1:这道题目还没有解决,看看这个多种错误就知道了
A2:我发现输入两位数,它就会被拆开,于是我想变成int型的num再存入队列,就可以解决多位数的问题,但是我队列和堆栈为了放字符都是char型的,int型的num放不进去
A3:还有负数的问题,我想着在case ‘-’里多加个判断,但是也遇到了和多位数以上的麻烦,不知道怎么连续放入同一个位置
A4:题目还有非整数的出现,意味着有小数点,这也是没有考虑到的一个符号
2.4 题目4:7-5 jmu-报数游戏(编程题)
2.4.1设计思路
while(队列不空)
count++
出队
入队
if(count==m)
输出队头
出队
count初始化为1
end if
(控制格式忽略)
end while
2.4.2代码截图
2.4.3本题PTA提交列表说明
A1:编译错误是个小意外,忘记改编译器了
A2:部分正确是那个输出错误的点过了,还是pta好,可以骗点分。。
Q2:这题的思路是遍历队列,然后出队,再进队,相当于第一数移到最后一个接着继续报数,报到m的时候输出并出队不再入队,直到队空就可以了。一开始没有想到这样,就想着数到m出队,没有让它循环数数,然后不是很懂咋整,然后又在舍友的提点下,有了这个思路
3、栈和队列上机考试
3.1题目1:6-3 jmu-ds-表达式求解
3.1.1代码截图
3.1.2错误分析
思路好像和书上的差不多,就是遇到数字进栈然后遇到运算符,将两个数字出栈进行运算,将得到的结果进栈,然后同理进行下去,但是当我运行时,发现不没有得到我想要的答案,于是我就开始调试,以例题为例,一开始是56-20得到36进栈,然后2+4=6,6进栈,最后读到/号,应该是36/6,但是因为有空格的原因,我将空格放在了default里,数字也放在default里,于是它再次将4+2的2读了进去,于是变成了6/2,后来想把读到空格另外挑出来,但是失败了,代码反反复复的改,到最后的提交还是没做出来。
里面有个除数为0的测试点,本来应该可以偷点分,用了return 0;提示错误,用来exit(0)提示错误,用了goto也提示错误,emmm,我咋没想到用return;佛了
测试点还有个负数的情况,按照我的代码的思路好像也没考虑到负数的问题,也许我应该整段代码重新写一遍,重新整理一下思路
3.2题目2:jmu-ds-符号配对
3.2.2错误分析
这题一开始的思路和那题比较简单的符号配对思路一样,用switch来考虑,但是遇到‘/*’就会比较麻烦,于是先遍历整段代码将要判断的符号放进一个op数组里,然后再遍历op数组进行配对,遇到/*用‘z’进行标记,遇到‘*/’用‘y’进行标记。把左括号进栈,然后再看右括号,能配对的就将相应的左括号出栈,然后再判断缺失的是左括号还是右括号,理想很丰满,现实很骨感,这段代码还是没有实现这个功能,目前只能过一个测试点,代码有待改进