2021年度训练联盟热身训练赛第三场
模拟数字电路
思路:
用栈,把A B C D 等字母压入栈中,如果对应的是 T 那么压入的就是 1 ,对应 F 就压入 0 。遇到 + 或 * 时,从栈中弹出两个字母,做 && 或 || 运算,做完运算再压入栈中,遇到 - 时,就只弹出一个字母,做非运算,最后看栈顶元素。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <algorithm> 6 #include <cmath> 7 #include <map> 8 #include <stack> 9 10 using namespace std; 11 12 int num[30]; 13 stack<int>stk; 14 15 int main() 16 { 17 int n, x = 0; 18 cin >> n; 19 getchar(); 20 string s1; 21 getline(cin, s1); 22 for (int i = 0; i < s1.length(); i++) 23 { 24 if (s1[i] == ' ') 25 continue; 26 else { 27 if (s1[i] == 'T') 28 num[x++] = 1; 29 if (s1[i] == 'F') 30 num[x++] = 0; 31 } 32 } 33 string s; 34 getline(cin, s); 35 36 for (int i = 0; i < s.length(); i++) 37 { 38 if (s[i] == ' ') 39 continue; 40 41 if (s[i] >= 'A' && s[i] <= 'Z') 42 { 43 stk.push(num[s[i] - 'A']); 44 } 45 else 46 { 47 if (s[i] == '-') 48 { 49 int temp = stk.top(); 50 stk.pop(); 51 52 if (temp == 1) 53 temp = 0; 54 55 else 56 temp = 1; 57 58 stk.push(temp); 59 } 60 else { 61 int temp1, temp2, temp; 62 temp1 = stk.top(); 63 stk.pop(); 64 temp2 = stk.top(); 65 stk.pop(); 66 if (s[i] == '*') 67 temp = temp1 && temp2; 68 69 if (s[i] == '+') 70 temp = temp1 || temp2; 71 72 stk.push(temp); 73 74 } 75 } 76 } 77 78 if (stk.top()) 79 cout << "T" << endl; 80 else 81 cout << "F" << endl; 82 83 return 0; 84 85 }

浙公网安备 33010602011771号