HihoCoder - 1110

题意:

您的任务是判断输入是否是合法的正则表达式。正则表达式定义如下:

1: 0和1都是正则表达式。

2:如果P和Q是正则表达式,那么PQ就是正则表达式。

3:如果P是正则表达式,(P)就是正则表达式。

4:如果P是正则表达式,则P*是正则表达式。

5:如果P和Q是正则表达式,则P|Q是正则表达式。

题解:

如果只有01,那么这个串肯定符合要求。所以不符合要求主要是违背了3,4,5号规则。下面分别说一下

1、对于3号规则,我们可以用栈去判断左右括号是否配对(我记得专门有这样一道题)。如果配对的话还要注意一下左右括号之间不能为空

2、对于4号规则,我们发现我们不用去管‘*’号右边的,只要‘*’号左边的满足规则就行。if((s[i]==‘*‘ && s[i-1]==‘(‘) || (s[i]==‘*‘ && s[i-1]==‘|‘)) 或者s[0]==‘*‘,这三项种情况只要发生一个这个串就不行

3、对于5号规则if((s[i]==‘|‘ && s[i-1]==‘(‘) || (s[i]==‘|‘ && s[i+1]==‘)‘)),s[0]==‘|‘ , s[len-1]==‘|‘。这四项种情况只要发生一个这个串就不行

代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=105;
const int INF=0x3f3f3f3f;
const double eps=1e-10;
stack<int>r;
int main()
{
    char s[maxn];
    while(~scanf("%s",s))
    {
        while(!r.empty())
            r.pop();
        int len=strlen(s);
        int flag=0;
        if(s[0]==‘*‘ || s[0]==‘|‘ || s[len-1]==‘|‘)
        {
            printf("no\n");
            continue;
        }
        for(int i=0; i<len; ++i)
        {
            if((s[i]==‘*‘ && s[i-1]==‘(‘) || (s[i]==‘*‘ && s[i-1]==‘|‘))
            {
                flag=1;
                break;
            }
            if((s[i]==‘|‘ && s[i-1]==‘(‘) || (s[i]==‘|‘ && s[i+1]==‘)‘))
            {
                flag=1;
                break;
            }
            if(s[i]==‘(‘)
                r.push(i);
            else if(s[i]==‘)‘)
            {
                if(r.size())
                {
                    if(i-r.top()==1)
                    {
                        flag=1;
                        break;
                    }
                    else r.pop();
                }
                else
                {
                    flag=1;
                    break;
                }
            }
        }
        if(flag)
        {
            printf("no\n");
        }
        else
        {
            printf("yes\n");
        }
    }
    return 0;
}

相关推荐