COJ1182(表达式)
生活随笔
收集整理的這篇文章主要介紹了
COJ1182(表达式)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Description
設S是一個合法的表達式,E為一個數(shù)字字符序列,則合法的表達式可以表示為:E, +E, -E, (S),+(S),-(S),S+(S),S-(S),S*(S),S/(S) 等。(E可以是全‘0’的字符串)。
請注意+S, -S, S+S等不一定是合法的表達式,因為可能出現(xiàn)如“+-E”運算符相鄰情況,另外出現(xiàn)“()”括號中沒有元素的表達式也是不合法的。
Input
每行一個字符串,最長不超過1023個字符。可能有空行。
Output
如果表達式合法,輸入“Yes”,否則輸入“No”,然后換行。
如果表達式為空,則輸出一個空行。
Sample Input
-1+2
+-1+2
+(-1+2)
()-23
Sample Output
Yes
No
Yes
No
第一次寫自動機,最開始沒調(diào)用初始化自動機的函數(shù),調(diào)了n久,測試數(shù)據(jù)對后,交上去又WA,反復檢查了自動機好幾遍,硬是沒發(fā)現(xiàn)錯誤,最后無意中發(fā)現(xiàn)輸出的是“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;
}
總結(jié)
以上是生活随笔為你收集整理的COJ1182(表达式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用ChemDraw建立多中心结构
- 下一篇: spring+mybatis实现读写分离