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’进行标记。把左括号进栈,然后再看右括号,能配对的就将相应的左括号出栈,然后再判断缺失的是左括号还是右括号,理想很丰满,现实很骨感,这段代码还是没有实现这个功能,目前只能过一个测试点,代码有待改进
posted @ 2019-04-21 21:51  Hyjjing  阅读(125)  评论(0编辑  收藏  举报