1.本周学习总结

  • 1.这两周学习的栈和队列相较于前面学的链表较为好理解,但是也有它们的难点,比如,在初始化栈和队列时需要谨慎处理,在上机考试遇到的在一个数组中实现两个堆栈问题,虽然在平时敲过了,但是敲的时候懵懵的,没有完全理解透,导致上机考试时没有处理好s->top1和s->top2,把s->top1初值设成了0,导致发生了越界,而且第一个数组入栈操作是S->Data[++S->top1]=X还是S->Data[S->top1++]=X这个问题思考了很久,也终于理解了,通过打pta不仅弄懂在课堂上没有弄懂的问题,还学习到新的知识,比如如何将结构体写入队列中。
  • 2.书上关于栈的各种操作都编写在各个函数中,如果要实际运用起来,需要写很长的代码,代码冗长,看得也费劲,但是老师在课上讲了STL容器,用起来十分方便,原来进栈时需要编写一大段代码现在只需要st.push(x),极大方便了我们写代码。栈和队列都是存储数据的结构,但它们也有着它们各自的特点,栈是后进先出,只能在栈顶操作,而队列是先进先出,可以在头尾进行操作,两者各有优势,可以解决不同的问题。

2.PTA实验作业

2.1.题目1

6-3 jmu-ds-是否合法出入栈操作
假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序列。 比如输入字符串IOOI,表示栈操作为入栈出栈出栈入栈,这样操作序列是不合法。

2.1.1代码截图

2.1.3本题PTA提交列表说明。

  • 1.前面因为脑子瓦特了,遍历到O的时侯,并判断栈顶是否为I又进行了一次判断,导致正确答案也会变成错的;
  • 2.在遍历到O时,没有判断栈是否为空,如果没有这一步,出栈->入栈->出栈即O->i->O也会变成正确;
  • 3.一开始没有看清题目,认为最后栈中还有元素也是对的,在经过舍友提醒,栈应为空;

2.2.题目2

6-11 另类循环队列
如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。

2.2.2代码截图

2.2.3本题PTA提交列表说明。

  • 1.开始时,由于没有尾指针的存在,认为头尾指针就是头指针,进队列时直接将头指针也加一,pta显示多种错误,后来看了书,知道怎么解决没有尾指针的为题;
  • 2. 第二次还是动了头指针写下了Q->Front=(Q->Front+Q->Count)%Q->MaxSize愚蠢代码,后面知道在进队列的时候头指针不能改变。

2.3.题目3

7-2 jmu-ds-符号配对
假设表达式中允许包含3种括号:圆括号、方括号和大括号。即(,[,'{'。编写一个算法判断表达式中的括号是否正确配对, 要求利用栈的结构实现。

2.3.1设计思路

定义一个字符串str用来存储表达式
输入表达式
定义一个字符栈st来存储左符号 
定义变量flag来判断左右符号是否配对 
for i=0 to str[i]                                //遍历字符串
      if  遇到左符号 then
            左符号入栈                           //如果遇到左符号,将左符号入栈 
      if  遇到右符号 then  
	        if 栈空 then
			    输出no 
		        结束程序                         //如果栈为空,说明没有左符号与右符号配对
	        if 栈不空 then
			    取栈顶
		        if 左右符号配对     then
                    flag=1;
                if 左右符号不匹配   then
                    输出栈定符号;
                    输出no;
                    结束程序;                   //如果左右符号不匹配,直接输出然后退出程序 
		         出栈                  
end for
if 栈空&&flag=1 then            
      输出yes
else
      取栈顶
      出栈 
      输出栈中无法配对到右符号的左符号 
      输出no 
       

2.3.2代码截图

2.3.3本题PTA提交列表说明。

  • 1.刚开始写栈的操作都是用函数,没有使用STL容器,导致调试起来有点麻烦 ,开始时没有考虑到栈空的情况下,右符号无法匹配到左符号;
  • 2.如果左符号匹配到右符号,直接return true跳出函数,没有考虑到后面函数的匹配,比如[ ( { } ) )这个表达式,在程序遍历到 } 时,直接认为表达是正确的,然后我使用了一个flag变量来判断,在最后遍历完表达式后,利用flag是否等于1来判断是否全部匹配;
  • 3.没有考虑到左符号多于右符号的情况,在遍历完字符串完后利用栈是否为空来判断左符号是否与右符号全部配对
  • 4.后面为了减短代码量,改用老师教的STL容器来写,发现了 ( { [ ] } }这个错误竟然在pta中能过 ,后面将flag=0的情况直接return 0.

2.4.题目4

7-1 jmu-字符串是否对称
编写一个算法利用顺序栈判断一个字符串是否是对称串。所谓对称串是指从左向右读和从右向左读的序列相同。

2.4.1设计思路

创建一个栈st;
初始化st
将字符串中的每一个字母入栈
for i=0 to str[i]='\0'                      
    出栈并将栈中元素存入e中  //遍历字符串,并将栈中元素一个一个输出 
    if   e!=str[i]   then 
	   销毁栈;
       return  false;
end for 
销毁栈

2.4.2代码截图




2.4.3本题PTA提交列表说明。



  • 1.刚开始的时候没有把出栈和入栈函数写好,把s->top初值赋成为0;导致程序发生了越界;
  • 2.再把字符串输入的时候,是用了gets导致会把回车吸收到字符串中,后面直接用c++的语句cin写。

3、栈和队列上机考试

3.1在一个数组中实现两个堆栈

3.1.1错误代码截图


3.1.2错误原因及体会

错误原因:在第一个数组入栈时操作时,S->Data[++S->Top1]=X,而出栈却变成了X=S->Data[S->Top1++];而第二个数组入栈时的操作是 if(Tag==2)S->Data[--S->Top2]=X出栈却变成了 X=S->Data[S->Top2--]导致发生了段错误;
体会:感觉自己的这种写法虽然简洁,但是特别容易搞混栈顶指针,还是分开写比较好,还有就是可能是自己还没把栈的入栈和出栈操作还不熟,才会发生这种错误,要赶紧把栈的操作熟悉起来,不然以后学习到后面,又把前面的知识给忘了,得不偿失;

3.2jmu-ds-舞伴问题

3.1.1错误代码截图


3.1.2错误原因及体会

错误原因:没看见主函数已经帮我们输出了‘F’或‘M’,而且输出中忘加了一个空格
体会:看清主函数和输入条件特别重要,这一题还让我明白了如何将队列运用到结构体中。