hihocoder java_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]==‘|‘。这四项种情况只要发生一个这个串就不行

代码:

1 #include

2 #include

3 #include

4 #include

5 #include

6 #include

7 #include

8 #include

9 #include

10 using namespacestd;11 typedef long longll;12 const int maxn=105;13 const int INF=0x3f3f3f3f;14 const double eps=1e-10;15 stackr;16 intmain()17 {18 chars[maxn];19 while(~scanf("%s",s))20 {21 while(!r.empty())22 r.pop();23 int len=strlen(s);24 int flag=0;25 if(s[0]==‘*‘ || s[0]==‘|‘ || s[len-1]==‘|‘)26 {27 printf("no");28 continue;29 }30 for(int i=0; i

56 {57 flag=1;58 break;59 }60 }61 }62 if(flag)63 {64 printf("no");65 }66 else

67 {68 printf("yes");69 }70 }71 return 0;72 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值