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