Loading

第03次作业-栈和队列

1.学习总结

1.1 写出你认为本周学习中比较重要的知识点关键词:线性表、栈和队列(特殊的线性表)

1.2 使用思维导图将这些关键词组织起来。

2.PTA实验作业

本周要求挑选出3道题目书写设计思路、调试过程。设计思路使用伪代码描述。题目选做要求:

  • 不能选函数题
  • 编程题选3题

注意:本次及以后的作业代码均需提交到Git仓库进行保存与未来的检查,并在学习总结小节截图你的提交记录。请立刻规划好存放你代码的目录结构,每次写完一题提交一次。具体提交方式请参见本周学习总结。

2.1 题目1:7-1 jmu-字符串是否对称

2.2 设计思路(伪代码或流程图)

BEGIN
建栈
定义字符串变量str
forint i=0;i<栈长;i++)//入栈准备
     push 入栈;
forint =0;i<栈长;i++)//栈元素依次出栈
     push 出栈;
            出栈对称匹配;
            if (出栈元素!=str[i])
                    字符串不对称(no);
            else
                    字符串对称(yes);
END

2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)

2.4 PTA提交列表说明。

错误分析:1、先用C写的,发现string这个在C比较不会用,然后就用C++了;

     2、部分正确是出栈时,一开始是用定义一个str2 =s1.pop时发现这是一个错误,

      会导致无论什么情况都是no,所以直接从栈顶比对比较好,可见在对栈做一些

      操作时,对栈顶的操作很重要!

题目2:7-3 表达式转换

设计思路(伪代码或流程图)

BEGIN
核心部分 读取字符元素
if(操作数) 出栈;输出; else if (操作符) if(“)”) 出栈,输出其他操作符; 直到 操作符==“(”; 出栈不输出; else //优先级比较; top>=当前字符; 出栈输出; 直至小于; //定义flag 用来做当前操作; END

代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)

PTA提交列表说明。

 

错误分析:1、这题做了很久,最终的代码大部分都是参考别人的;

      2、开始的时候用C写,写得差不多的时候,好不容易在DEV上过了,pta直接就报个不支持<stack>函数库;一直编译错误

      3、不得不用C++,然而C++越写越乱,最后放弃了;

      4、然后找大神教我用C写;才马马虎虎过了;

      5、其实这个主要是抓住它的核心,要搞清几个情况的判断,这题我对栈的一点动态分析有一点进步。

题目3:7-1 jmu-报数游戏

设计思路(伪代码或流程图)

BEGIN
定义struct Queue;
    创建 queue ;
    cin>>人数n;
    cin>>退出为此m;
    if n<m 
        输出 error;
    return 0;
    for (i=1;i<人数n;i++) 
        尾指针rear 编号
    while (q)
        for(i=1;i<m;i++) 
        报数到m位置
        头指针从1开始递增
        尾指针run 循环
    输出编号:
END 

代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)

 

PTA提交列表说明。

这是啥错误啊??忽视了scanf的返回值,明明也有定义头文件。。

3.截图本周题目集的PTA最后排名

3.1 栈PTA排名

 

3.2 队列PTA排名

 

3.3 我的总分:130分 ——>2分

4. 阅读代码

#include <bits/stdc++.h>  
  
using namespace std;  
const int MAXN=1e5+10;  
const int inf=1e9;  
int n,m;  
int top,flag;  
char ans[MAXN];  
char s[MAXN*10];  
char sta[MAXN];  
int main()  
{  
    int cnt=0;  
    while(gets(s)&&s[0]!='.')  
    {  
        int l=strlen(s);  
        for(int i=0; i<l; ++i)  
        {  
            if(s[i]=='('||s[i]==')'||s[i]=='{'||s[i]=='}'||s[i]=='['||s[i]==']')  
            {  
                ans[cnt++]=s[i];  
            }  
            else if(s[i]=='/'&&s[i+1]=='*')  
            {  
                ans[cnt++]='a';  
                i++;  
            }  
            else if(s[i]=='*'&&s[i+1]=='/')  
            {  
                ans[cnt++]='b';  
                i++;  
            }  
        }  
    }  
    //puts(ans);  
    top=0;  
    flag=1;  
    int i;  
    for(i=0; i<cnt; ++i)  
    {  
        if(ans[i]=='('||ans[i]=='['||ans[i]=='{'||ans[i]=='a')  
        {  
            sta[top++]=ans[i];  
        }  
        else if(!top)  
        {  
            puts("NO");  
            printf("?-");  
            if(ans[i]=='b')printf("*/\n");  
            else printf("%c\n",ans[i]);  
            flag=0;  
            break;  
        }  
        else if(ans[i]-sta[top-1]!=1&&ans[i]-sta[top-1]!=2)  
        {  
            puts("NO");  
            if(sta[top-1]=='a')printf("/*");  
            else printf("%c",sta[top-1]);  
            printf("-?\n");  
            flag=0;  
            break;  
        }  
        else top--;  
    }  
    if(flag)  
    {  
        if(!top)puts("YES");  
        else  
        {  
            puts("NO");  
            if(sta[0]=='a')printf("/*");  
            else printf("%c",sta[0]);  
            printf("-?\n");  
        }  
    }  
    return 0;  
}  

他这个思路挺不错的:

首先就是把串全部读进来,合成一个大串,只保留括号即可。

然后再对新生成的串处理,读入左括号,直接压入栈顶。

如果读入的是右括号:

1.如果栈为空,那么缺少与之对应的左括号。、

2.如果栈顶元素与之不匹配,那么缺少与栈顶元素相匹配的右括号。

处理完之后,如果栈为空,则表示完全匹配,如果有剩余,那么就是缺少右括号。因为是输出第一个缺少的,所以直接输出栈尾的元素就可以。

5. 代码Git提交记录截图

https://gitee.com/zhqwang/hello-world/tree/master

posted @ 2018-04-07 20:36  Kingwan  阅读(224)  评论(1编辑  收藏  举报