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.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’进行标记。把左括号进栈,而后再看右括号,能配对的就将相应的左括号出栈,而后再判断缺失的是左括号仍是右括号,理想很丰满,现实很骨感,这段代码仍是没有实现这个功能,目前只能过一个测试点,代码有待改进
相关文章
相关标签/搜索