zoukankan      html  css  js  c++  java
  • 第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

  • 相关阅读:
    Yum与list结合
    DNS辅助
    DHCP中继
    apache+SSL 搭建https
    vsftpd服务器
    根据Eclipse SVN changelog使用ANT自动打增量包
    SHELL 近期学习
    Tomcat源码学习一
    oracle笔记
    Linux 下安装 SVN服务器
  • 原文地址:https://www.cnblogs.com/zhangqingwang/p/8734649.html
Copyright © 2011-2022 走看看