题目:点此
思路:{
利用两个栈,一个存数据(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
{ 。。。。。。。。。。。}
while(){
............................}
}
}
题目AC代码:
1 #include
2 #include
3 #include
4 using namespace std;
5 int b[5][6];
6 stack data;
7 stack 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
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 }
关于找一找教程网
本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[结题报告]http://www.zyiz.net/tech/detail-98665.html