信息学奥赛一本通(C++版) 第三部分 数据结构 第一章 栈

来源:互联网 发布:淘宝会员数量 编辑:程序博客网 时间:2024/06/06 06:29

 信息学奥赛一本通(C++版) 第三部分 数据结构 第一章 栈

http://ybt.ssoier.cn:8088/

//1331 【例1-2】后缀表达式的值
//该题 一本通 的在线测评,一提交就说超时,同样的题目 在洛谷
//https://www.luogu.org/problem/show?pid=1449 同样的代码,一提交就AC
//P1449 后缀表达式
//以下代码为 洛谷AC 代码,却在 一本通 超时代码
//2017-10-26 21:30
//将读取代码修改,不再超时,却报答案错误,看来有必要翻翻原书了。
//下述代码,在洛谷再次通过
//输入:
//16 9 4 3 +*-@

//输出:
//-47
 
#include <stdio.h>
#include <string.h>
char a[10000];
int stack[1000],top=-1;
int main(){
    int k=0,i,len,b,tag,d,e,f;//此处写成 int k,i,len,b,tag,d,e,f;
    char c;
    gets(a);
    len=strlen(a);
    i=0;
    while(i<len){
        b=0,tag=0;
        while(i<len&&'0'<=a[i]&&a[i]<='9')b*=10,b+=a[i]-'0',i++,tag=1;
        if(tag)top++,stack[top]=b;
        else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'){
            d=stack[top],top--;
            e=stack[top],top--;
            switch(a[i]){
                case '+':
                    f=e+d;
                    break;
                case '-':
                    f=e-d;
                    break;
                case '*':
                    f=e*d;
                    break;
                case '/':
                    f=e/d;
                    break;
            }
            top++;
            stack[top]=f;
            i++;
        }else
            i++;
    }     
    printf("%d",stack[top]);
    return 0;
}


//1331 【例1-2】后缀表达式的值
//该题 一本通 的在线测评,一提交就说超时,同样的题目 在洛谷
//https://www.luogu.org/problem/show?pid=1449 同样的代码,一提交就AC
//P1449 后缀表达式
//以下代码为 洛谷AC 代码,却在 一本通 超时代码
//2017-10-26 21:30
#include <stdio.h>
#include <string.h>
char a[10000];
int stack[1000],top=-1;
int main(){
    int k=0,i,len,b,tag,d,e,f;//此处写成 int k,i,len,b,tag,d,e,f;
    char c;
    while((c=getchar())!='@')
        a[k++]=c;
    a[k]='\0';
    len=strlen(a);
    i=0;
    while(i<len){
        b=0,tag=0;
        while(i<len&&'0'<=a[i]&&a[i]<='9')b*=10,b+=a[i]-'0',i++,tag=1;
        if(tag)top++,stack[top]=b;
        else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'){
            d=stack[top],top--;
            e=stack[top],top--;
            switch(a[i]){
                case '+':
                    f=e+d;
                    break;
                case '-':
                    f=e-d;
                    break;
                case '*':
                    f=e*d;
                    break;
                case '/':
                    f=e/d;
                    break;
            }
            top++;
            stack[top]=f;
            i++;
        }else
            i++;
    }     
    printf("%d",stack[top]);
    return 0;
}

//1353 表达式括号匹配(stack)
#include <stdio.h>
#include <string.h>
int stack[1000],top=-1;
char a[10000];
int main(){
    int i,len;
    scanf("%s",a);
    len=strlen(a);
    for(i=0;i<len;i++)
        if(a[i]=='(')top++,stack[top]=1;//( 1
        else if(a[i]==')'){
            if(top>=0)top--;
            else top++,stack[top]=2;//) 2
        }
    if(top==-1)printf("YES");
    else printf("NO");
    return 0;
}

//1354 括弧匹配检验
//该题说明如下:
//题目中的字符串根本不能用,夹杂着中文的括号,英文的空格
//要进行测试,读者只能自行输入英文的符号2017-10-26 22:27
#include <stdio.h>
#include <string.h>
char a[1000];
int stack[1000],top=-1;//(1 )2 [3 ]4
int main(){
    int i,len;
    scanf("%s",a);
    len=strlen(a);
    for(i=0;i<len;i++)
        if(a[i]=='(')top++,stack[top]=1;
        else if(a[i]==')'){
            if(top==-1)top++,stack[top]=2;
            else if(stack[top]==1)top--;
            else top++,stack[top]=2;
        }else if(a[i]=='[')top++,stack[top]=3;
        else if(a[i]==']'){
            if(top==-1)top++,stack[top]=4;
            else if(stack[top]==3)top--;
            else top++,stack[top]=4;
        }
    if(top==-1)printf("OK");
    else printf("Wrong");
    return 0;
}

//1355 字符串匹配问题(strs)
//一月前编写此题,一个多小时,提交,未果,搁置
//http://blog.csdn.net/ametake/article/details/43987407此文写得不错,吸引本人原因,代码写得够短
//第一步,将字符映射成数字,处理起来方便
//样例通过,提交,测试点2,3,5答案错误
//反复阅读代码,觉得所有情况都考虑周全,很需要上述三个测试点数据,无奈,在http://codevs.cn/problem/3543/提交研究
//在上述网站找到一组测试数据:
//输入:
//6
//{}{}<><>()()[][]
//{{}}{{}}<<>><<>>(())(())[{}][[]]
//{{}}{{}}<<>><<>>(())(())[[]][[]]
//{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
//><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
//([])
//输出:
//YES
//NO
//YES
//YES
//NO
//NO
//对照上述例子,发现,top未在每次读取新字符串时,初始化为0,难怪这个错误怎么找都找不到,原来是初始化的问题。
//codevs里提交AC,ybt里提交AC,2017-12-9 12:33
#include <stdio.h>
#include <string.h>
char a[]={'{','[','(','<','}',']',')','>'},s[300];//{0 }4 [1 ]5 (2 )6 <3 >7
int b[300],stack[300],top;//b[i]与s[i]一一映射
int main(){
    int t,len,i,j,k,flag;//flag合法,非法标记
    scanf("%d",&t);
    while(t--){
        flag=1,top=0;//漏了top=0这句,查了好久
        scanf("%s",s);//此处写成 scanf("%d",s); 尽出昏招
        len=strlen(s);
        for(i=0;i<len;i++)//建立字符与数字的一一映射关系
            for(j=0;j<8;j++)
                if(s[i]==a[j]){
                    b[i]=j;
                    break;
                }
        i=0;
        while(i<len){//是否匹配处理
            //printf("b[%d]=%d\n",i,b[i]);
            if(b[i]<=3)//b[i]元素想要入栈
                if(top==0||b[i]>=stack[top]){//b[i]元素可以入栈,top==0栈为空,或栈内符号满足嵌套关系
                    top++,stack[top]=b[i];
                }else{//b[i]元素无法入栈,该组数据非法,结束该组数据处理
                    flag=0;
                    break;
                }
            else if(b[i]>=4){//b[i]元素希望与栈内元素配对
                if(top>0&&stack[top]+4==b[i]){//首先栈内要有元素,同时判断是否配对
                    top--;
                }else{//无法配对,结束 该组数据处理
                    flag=0;
                    break;
                }
            }
            i++;
        }
        if(top)printf("NO\n");//栈内有元素,匹配不成功
        else if(flag==1)printf("YES\n");//栈内无元素,匹配成功
        else printf("NO\n");//栈内无元素,匹配不成功
    }
    return 0;
}

//1357 车厢调度(train)
//https://www.cnblogs.com/zxqxwnngztxx/p/6679727.html代码写得精炼
//该题思维量比较大,2017-12-11 AC
#include <stdio.h>
int a[1010],b[1010],top=0;
int main(){
    int n,i,cur;
    scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%d",&a[i]);//a[i]为到达B站的车厢
    b[0]=0;
    for(i=1,cur=1;i<=n;i++){//模拟进栈,到达A站,出栈,到达B站,模拟
        while(b[top]<a[i])top++,b[top]=cur,cur++;//比a[i]小的车厢都要在栈中 cur为需要进栈的车厢,这个要求技巧比较高
        if(b[top]==a[i])top--;//将a[i]弹出栈
        else{
            printf("NO");
            return 0;
        }
    }
    printf("YES");
    return 0;
}


阅读全文
0 0