題目:點此

思路:{
利用兩個堆疊,一個存資料(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 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/73326.html
標籤:C++
