题目:点此

思路:{

    利用两个栈,一个存数据(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 }
posted on 2020-01-08 12:30  eason66  阅读(259)  评论(0编辑  收藏  举报