acm编程习题1001 DotNotation

1000题比较简单,不再写,从1001开始记录我的编程练习之路

题目:

love8909最近在学一种新的表达式表示法,称之为<DotNotation>。定义如下:

<DotNotation> := <Number> | <DotNotation><Dots><Operator><Dots><Number>
<Dots> := "" | <Dots>"."
<Operator> := exactly one of "+-*/"
<Number> := exactly one of "0123456789"

这是一个递归的定义,即是说
单个的数字是<DotNotation>
在<DotNotation>后连接任意数量的”.”(<Dots>),然后连接一个操作符(<Operator>),再接上任意数量的”.”,最后再接一个数字,得到的还是还是一个<DotNotation>
比如说,"5"是一个<DotNotation>,如果在后面接上".+.7",你将得到另一个<DotNotation>, 如果你再在后面接上"*..3"得到"5.+.7*..3",这还是一个<DotNotation>。

可是love8909很纠结,因为他竟然不会判断一个<DotNotation>是否合法,你能帮帮他吗?

Input

第1行一个数T,表示测试数据组数
后面T行每行一个长度为L的字符串(1 <= L <= 50)

Output

T行,每一行,如果合法,输出”Yes”,反之输出”No”

Sample Input

5
3+5
9..+.5...*....3
5.3+4
9*9*9*9*9*9*9*9*9*9*9*9*9*9
3.........../...........4

Sample Output

Yes
Yes
No
Yes
Yes 


我的代码如下:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int i=0;
void judge(char *s,int *p);
int main()
{
int t;
int *p;
char str[51]={'\0'};
scanf("%d",&t);
p=(int*)malloc(sizeof(int)*t);
for(i=0;i<t;i++)
{
scanf("%s",str);
judge(str,p);
}
for(i=0;i<t;i++)
{
if(p[i]==1)
printf("Yes\n");
else 
printf("No\n");
}
free(p);
return 0;
}
void judge(char *s,int *p)
{
int dotnum=0;
int calnum=0;
int n;
int slen=strlen(s);
char s1[51]={'\0'};
if (slen==1)
{
if(s[0]>='0'&&s[0]<='9')
p[i]=1;
else
p[i]=0;


}
else
{
if(s[slen-1]>='0'&&s[slen-1]<='9')
{
n=slen-2;
while(s[n]=='.'||s[n]=='+'||s[n]=='-'||s[n]=='*'||s[n]=='/')
{
if(s[n]=='.')
dotnum++;
else 
calnum++;
n--;
}
if(calnum==1)
{
strncpy(s1,s,slen-1-dotnum-calnum);
judge(s1,p);

}
else
p[i]=0;


}
else
p[i]=0;




}
}


这里面用的是递归的方法。流程图就不画了,随后会把代码的注释加上(晕,怎么这上面不支持缩进呀,明明代码上面有缩进,一发表就没了)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值