题目:点此
思路:{
利用两个栈,一个存数据(v、f),一个存运算符(&&、||、!、(、))。
读到数据压入数据栈。
读到!:直接压栈。
读到运算符:{
如果符号栈栈顶的优先级没此运算符高,直接压栈。
否则取出数据栈栈顶和数据栈新的栈顶进行运算,符号栈出栈,再判断一遍栈顶优先级有没有此运算符高。
}
读完后把剩下的运算算完,栈顶是结果。
}
其实布尔表达式与普通表达式没什么区别,只是优先级不一样,数字换成了真假。参见普通表达式结题报告。
犯的错误:{
1.第四十二行的if里没加continue,也就是如果进了if就会执行后面的语句,这不是我们想要的。
2.在写 读入字符串的方法 时,为了告诉你们该包哪个头文件时,此代码的半成品被用作试验品,试验好了以后没把代码复原。
3.粘贴普通表达式的代码时,没对代码进行修改。
4.因考虑的不周全,表示优先级的二维表打错了。
5.没考虑空格。
6.遇到括号应该出栈,而不是结束循环。
}
收获:{
1.最好老老实实地打if-else,以防漏continue(if…else…=if…continue; …)。
2.试验完了之后别忘了复原。
3.最好老老实实的写,不要复制粘贴。
4.二维表一定要认真考虑之后再打。
5.要考虑周全,为防止错,可以用if…else if…else…。
6.不要想当然。
7.读多行的方法:
string line;
while(getline(cin,line)){
for(int i=0;i<line.size();i++)
{ 。。。。。。。。。。。}
while(){
............................}
}
}
题目AC代码:
1 #include <iostream> 2 #include <stack> 3 #include <string.h> 4 using namespace std; 5 int b[5][6]; 6 stack <bool> data; 7 stack <char> symbol; 8 int change(char a){ 9 switch(a){ 10 case '&':return 0; 11 case '|':return 1; 12 case '!':return 2; 13 case '(':return 3; 14 case ')':return 4; 15 case '@':return 5; 16 } 17 } 18 int main(){ 19 memset(b,0,sizeof(b)); 20 for(int i=4;i>=0;i--){ 21 b[i][3]=1; 22 b[i][5]=1; 23 b[i][4]=1; 24 b[3][i]=1; 25 } 26 b[4][4]=0; 27 b[0][1]=1; 28 string a; 29 symbol.push('@'); 30 data.push(false); 31 while(getline(cin,a)){ 32 for(int i=0;i<a.length();i++){ 33 if(a[i]==' '){ 34 continue; 35 } 36 if(a[i]=='V'||a[i]=='F'){ 37 if(a[i]=='V'){ 38 data.push(true); 39 } 40 else{ 41 data.push(false); 42 } 43 } 44 else{ 45 if(a[i]=='!'){ 46 symbol.push(a[i]); 47 continue; 48 } 49 int symbol_index; 50 symbol_index=change(a[i]); 51 while(b[symbol_index][change(symbol.top())]==0){ 52 bool b=data.top(); 53 data.pop(); 54 bool a=data.top(); 55 data.pop(); 56 switch(symbol.top()){ 57 case '&': data.push(a&&b);break; 58 case '|':data.push(a||b);break; 59 case '!':data.push(a);data.push(!b);break; 60 } 61 symbol.pop(); 62 } 63 if(a[i]==')'){ 64 if(symbol.top()=='('){ 65 symbol.pop(); 66 } 67 continue; 68 } 69 symbol.push(a[i]); 70 } 71 } 72 while(symbol.top()!='@'){ 73 if(symbol.top()=='('||symbol.top()==')'){ 74 symbol.pop(); 75 continue; 76 } 77 bool b=data.top(); 78 data.pop(); 79 bool a=data.top(); 80 data.pop(); 81 switch(symbol.top()){ 82 case '&':data.push(a&&b);break; 83 case '|':data.push(a||b);break; 84 case '!':data.push(a);data.push(!b);break; 85 } 86 symbol.pop(); 87 } 88 if(!data.top()){ 89 cout << "F\n"; 90 } 91 else{ 92 cout << "V\n"; 93 } 94 } 95 data.pop(); 96 return 0; 97 }