题意:从输入开始,1.输入样例数;2.然后输入一组样例中的行数n;3.前n-1行为定义变量(之间使用空格隔开),只需要map存进去就可以了(这里有覆盖的情况,故使用mp["s"] = "***"的方法赋值,因为insert的方法如果里面存在的话,插不进入数值);4.然后就是最后一行输入计算式子(之间使用空格隔开)。
思路:我使用的字符流的方法分割的的字符串,因为题中说了使用空格隔开的;
变量的储存使用map就可以,在最后一行输入计算式子之后,同样使用字符流分割的方法,分割出来,判断是加法、减法、变量、数 字(正负)。 我做的时候就是以为都是加法,所以WA了一次。
1 #include <iostream> 2 #include <algorithm> 3 #include <sstream> 4 #include <string> 5 #include <vector> 6 #include <queue> 7 #include <map> 8 9 #include <cstdio> 10 #include <cstring> 11 #include <cmath> 12 using namespace std; 13 14 // 讲字符串转换为数字(这里的函数名起得不合适) 15 long long asksum(string str, int s) { 16 int len = str.length(); 17 long long sum = 0; 18 for (int i = s; i < len; ++i) { 19 sum = sum*10+(str[i]-'0'); 20 // cout << "qwe" << endl; 21 } 22 // cout << sum << "+++++" << endl; 23 if (s) 24 return sum*-1; 25 return sum; 26 } 27 28 int main() { 29 // ios::sync_with_stdio(false); 30 // cin.tie(NULL); 31 // cout.tie(NULL); 32 33 int t, n; 34 string str, s; 35 map<string, int> mp; 36 // 储存变量 37 cin >> t; 38 while (t--) { 39 cin >> n; 40 getchar(); 41 mp.clear(); 42 // 每一次清空上一次残留的变量 43 long long sum = 0; 44 for (int i = 0; i < n; ++i) { 45 getline(cin, str); 46 if (i == n-1) { // 在输入计算式的时候直接出结果,也可以讲变量和计算式分开 47 int flag = 1; 48 // 这个flag就是用来标记是加法还是减法的。 49 stringstream ss(str); 50 while (ss >> s) { 51 if (s[0] >= '0' && s[0] <= '9') { 52 sum += asksum(s, 0)*flag; 53 // cout << "+" << endl; 54 } else if (s[0] == '-' && s[1] >= '0' && s[1] <= '9'){ 55 sum += asksum(s, 1)*flag; 56 // cout << "-" << endl; 57 } else if (s == "+") { 58 flag = 1; 59 } else if (s == "-") { 60 flag = -1; 61 } else if (s[0] >= 'a' && s[0] <= 'z') { 62 sum += mp[s]*flag; 63 } 64 } 65 } else { 66 stringstream ss(str); 67 string var; 68 int num = 0, zhi; 69 while (ss >> s) { 70 num++; 71 // 因为变量赋值只有三部分,所以这里只需要去第一次和第三次即可 72 if (num == 1) { 73 var = s; 74 } else if (num == 3) { 75 if (s[0] == '-') 76 zhi = asksum(s, 1); 77 else 78 zhi = asksum(s, 0); 79 } 80 } 81 mp[var] = zhi; 82 } 83 // cout << mp.size() << " = size" << endl; 84 } 85 // cout << "sum = " << sum << endl; 86 cout << sum << endl; 87 } 88 89 return 0; 90 }
关于字符串分流的知识点:字符串分割