• COJ1182(表达式)


    Description

    设S是一个合法的表达式,E为一个数字字符序列,则合法的表达式可以表示为:E, +E, -E, (S),+(S),-(S),S+(S),S-(S),S*(S),S/(S) 等。(E可以是全‘0’的字符串)。
    请注意+S, -S, S+S等不一定是合法的表达式,因为可能出现如“+-E”运算符相邻情况,另外出现“()”括号中没有元素的表达式也是不合法的。

    Input

     每行一个字符串,最长不超过1023个字符。可能有空行。

    Output

     如果表达式合法,输入“Yes”,否则输入“No”,然后换行。
    如果表达式为空,则输出一个空行。

    Sample Input

    -1+2
    +-1+2
     
    +(-1+2)
    ()-23

    Sample Output

    Yes
    No
     
    Yes
    No
     

    第一次写自动机,最开始没调用初始化自动机的函数,调了n久,测试数据对后,交上去又WA,反复检查了自动机好几遍,硬是没发现错误,最后无意中发现输出的是“Yes”和“No”,而我写成了“YES"和”NO",改过之后就AC了……
     
    View Code
    #include <stdio.h>
    #include <string.h>
    #define INI 0
    #define NUM 1
    #define OPT 2
    #define WRN -1
    #define N 1024
    int table[4][130];
    char s[N];
    int n;
    void init()
    {
        int state,ch;
        memset(table,0xff,sizeof(table));
        for(ch='0';ch<='9';ch++)    table[INI][ch]=table[NUM][ch]=table[OPT][ch]=NUM;
        table[INI]['+']=OPT;
        table[INI]['-']=OPT;
    
        table[NUM]['+']=OPT;
        table[NUM]['-']=OPT;
        table[NUM]['*']=OPT;
        table[NUM]['/']=OPT;
    }
    int dfa(int a,int b)
    {
        int i,j,state=INI;
        if(a>b) return WRN;
        for(i=a;i<=b;i++)
        {
            if(s[i]==' ' || s[i]=='\t') continue;
            if(s[i]=='(')
            {
                if(state==NUM)   return WRN;
                int cnt=1;
                for(j=i+1;j<=b;j++)
                {
                    if(s[j]=='(')    cnt++;
                    else if(s[j]==')')    cnt--;
                    if(cnt==0)   break;
                }
                if(cnt || dfa(i+1,j-1)!=NUM)  return WRN;
                state=NUM;
                i=j;
            }
            else state=table[state][s[i]];
            if(state==WRN)   return WRN;
        }
        if(state==NUM)  return NUM;
        return WRN;
    }
    int main()
    {
        init();
        while(gets(s))
        {
            n=strlen(s);
            if(n==0)    puts("");
            else    printf("%s\n",dfa(0,n-1)==NUM?"Yes":"No");
        }
        return 0;
    }
  • 相关阅读:
    JAVA 数据结构(16):SET(一)Java HashSet
    JAVA 数据结构(15):LIST(二)Java LinkedList
    PGSQL数据库里物化视图【materialized view】
    PGSQL存储过程学习
    PostgreSQL数据库结构
    javascript里面的document.getElementById
    odoo14学习----x2many操作与图片设置继承image.mixin
    odoo14在tree、kanban视图上添加dashboard
    odoo14在列表视图里添加自定义按钮
    python开发包之pyecharts
  • 原文地址:https://www.cnblogs.com/algorithms/p/2584186.html
Copyright © 2020-2023  润新知