题意:bool表达式求值,V:true;F:false
题解:堆栈+优先级判定
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cctype> 5 using namespace std; 6 const int N=1000; 7 char comp(char a,char b) 8 { 9 if(b=='\0') 10 { 11 if(a=='\0') 12 return '='; 13 else 14 return '>'; 15 } 16 else if(a=='\0') 17 return '<'; 18 else if(b=='(') 19 return '<'; 20 else if(b==')') 21 { 22 if(a=='(') 23 return '='; 24 else 25 return '>'; 26 } 27 else if(a=='(') 28 return '<'; 29 else 30 return '>'; 31 } 32 bool cac(bool a,bool b,char op) 33 { 34 if(op=='|') 35 return a||b; 36 else if(op=='&') 37 return a&&b; 38 } 39 bool solve(char s[]) 40 { 41 int len=strlen(s),optop=0,botop=0,i=0; 42 char opstk[N]; 43 bool bostk[N]; 44 opstk[optop++]='\0'; 45 while(s[i]!='\0'||opstk[optop-1]!='\0') 46 { 47 if(s[i]==' '||s[i]=='\t') 48 { 49 i++; 50 continue; 51 } 52 else if(s[i]=='!'||s[i]=='(') 53 opstk[optop++]=s[i++]; 54 else if(s[i]=='V'||s[i]=='F') 55 bostk[botop++]=(s[i]=='V'),i++; 56 else 57 { 58 switch(comp(opstk[optop-1],s[i])) 59 { 60 case '>': 61 if(opstk[optop-1]=='!') 62 { 63 optop--; 64 bostk[botop-1]^=true; 65 } 66 else 67 { 68 bool b=bostk[--botop],a=bostk[--botop]; 69 char ch=opstk[--optop]; 70 bostk[botop++]=cac(a,b,ch); 71 } 72 break; 73 case '<': 74 opstk[optop++]=s[i++]; 75 break; 76 case '=': 77 optop--; 78 i++; 79 break; 80 } 81 } 82 } 83 return bostk[0]; 84 } 85 int main() 86 { 87 char s[200]; 88 int ca=0; 89 while(gets(s)) 90 printf("Expression %d: %c\n",++ca,solve(s)?'V':'F'); 91 return 0; 92 }