第三章小结
这次做栈与队列的题目有很多收获。
首先是在栈这个方面,PTA上的题目是符号的匹配问题。
第一个问题,是在遇到右符号时,如何比较是否有左符号与之匹配。一开始的想法是,遇到左符号时,左符号要进栈,遇到右符号也要进栈,但这样做对于后续出栈、比较等等操作都十分麻烦,是不可行的,于是就考虑可以在遇到左符号时入栈,在遇到右符号时与栈顶元素进行比较,如果匹配,则栈顶元素出栈,一开始时我是用gettop函数来获得栈顶元素,但这样在栈空的情况下,则无法获取栈顶元素,会导致运行直接出错;于是在同学指导下,将书上的pop(&S,e)函数,改成了pop(e),即利用出栈函数同时返回栈顶元素为e,如果栈已空,则直接break,如果栈未空,则先出栈,再获得栈顶元素进行匹配,如果匹配则continue,如果不匹配则break;这种方式提高了代码的效率,而且更加通俗易懂;
第二个问题,就是我无法确定输入的总长度。因此在循环比较是否匹配时,就会遇到循环次数的问题,虽然在vs上运行是可以成功的,但在PTA上则通过不了,后来我在检查自己代码时,一行一行地分析是哪里出了问题,最终发现是循环次序出了问题,于是就用了一个strlen函数来取数组的长度length,再用length来限定循环的次数;
第三个问题,就是判断最终是否完全匹配的问题。因为如果右括号已经全部与左括号匹配,但仍然左括号有未被匹配,即栈非空,一样是没有完全匹配的情况。于是就在最终判断时,增加了一个判断条件,即要在栈空同时都匹配的情况下,才能输出yes,否则输出no;
第四个问题,则是函数的封装性问题。因为在代码中,main函数里对栈s的操作都是通过调用函数来进行的,但在最终判断栈是否为空时,则直接写了if(s==NULL),这样直接对s进行判断操作,破坏了函数的封装性,于是就再写了一个函数来专门判断栈s是否为空。
其次是在队列方面,PTA上的题目是银行队列简单模拟的问题。
在这个题目上,遇到的最大的问题,就是要分多个情况,利用多个判断来完成代码。首先是最基本的格式上的要求,即最后一个数后面不能有空格;其次是在判断中,要判断A、B队列是否已经为空,如果为空则要输出另一个队列剩下的数字;同时,在队列非空时,A窗口需要先输出两个数字,B窗口才能输出一个数字,那就要判断A窗口是否还有2个数可以输出,若只剩下一个,则要先输出A的数字,再输出B的数字。通过写注释和在纸上画画模拟情况,将代码的排版书写修改工整,保持自己思路的清晰,最终通过了PTA。