UVA11954 题解【模拟】

题目链接

题目大意:

模拟一个二进制位运算计算器,给定T行二进制下的操作序列,对于每行操作,输出计算得到的值。共有两类操作运算符,一元运算符not(取反),shr(右移),shl(左移),二元运算符and(且),or(或),xor(异或)。一元运算符的运算优先级高于二元运算符,二元运算符的优先级一致,需从左到右依次计算。

每次读入一个数判断是否还有操作符,把其之前的操作符从后往前运算掉,最后输出规格化结果(不含前导零)

AC代码如下:

  1. #include <bits/stdc++.h>  
  2. using namespace std;  
  3. stack<string> ops;  
  4. string formatNumber(string s) {  
  5.     while (!s.empty() && *s.begin() == '0')  
  6.         s.erase(s.begin());  
  7.     if (s.empty())  
  8.         s = "0";  
  9.     return s;  
  10. }  
  11. void judge(string n) {  
  12.     while (!ops.empty()) {  
  13.         string op = ops.top();  
  14.         ops.pop();  
  15.         if (op == "not") {  
  16.             n = formatNumber(n);  
  17.             for (int i = 0; i < n.size(); ++i)  
  18.                 n[i] = (n[i] == '0') ? '1' : '0';  
  19.         }  
  20.         else if (op == "shr") {  
  21.             n = formatNumber(n);  
  22.             if (!n.empty())  
  23.                 n.pop_back();  
  24.         }  
  25.         else if (op == "shl") {  
  26.             n = formatNumber(n);  
  27.             n.push_back('0');  
  28.         }  
  29.         else {  
  30.             string m = ops.top();  
  31.             ops.pop();  
  32.             while (m.size() < n.size()) m = "0" + m;  
  33.             while (n.size() < m.size()) n = "0" + n;  
  34.             if (op == "xor") {  
  35.                 for (int i = 0; i < n.size(); ++i)  
  36.                     n[i] = (n[i] == m[i]) ? '0' : '1';  
  37.             }  
  38.             else if (op == "and") {  
  39.                 for (int i = 0; i < n.size(); ++i)  
  40.                     n[i] = (n[i] == '1' && m[i] == '1') ? '1' : '0';  
  41.             }  
  42.             else {  
  43.                 for (int i = 0; i < n.size(); ++i)  
  44.                     n[i] = (n[i] == '1' || m[i] == '1') ? '1' : '0';  
  45.             }  
  46.         }  
  47.     }  
  48.     ops.push(n);  
  49. }  
  50. int main() {  
  51.     int T;  
  52.     scanf("%d", &T);  
  53.     string str;  
  54.     int cas = 1;  
  55.     while (T--) {  
  56.         while (!ops.empty())  
  57.             ops.pop();  
  58.         while (true)  
  59.         {  
  60.             cin >> str;  
  61.             char ch = getchar();  
  62.             if (str[0] == '1' || str[0] == '0')  
  63.                 judge(str); // number  
  64.             else  
  65.                 ops.push(str); // operator  
  66.             if (ch == ' ')  
  67.                 break;  
  68.         }  
  69.         printf("Case %d: ", cas++);  
  70.         cout << formatNumber(ops.top()) << endl;  
  71.     }  
  72.     return 0;  
  73. }  

原文地址:https://www.cnblogs.com/ZKin/p/9471048.html