UVa 327 - Evaluating Simple C Expressions解题报告

来源:互联网 发布:网络英语哪个机构最好 编辑:程序博客网 时间:2024/06/14 13:59

题意:模拟计算--,++的计算式

思路:利用stl可以很简单的实现,代码也很清晰明了。首先是利用string类输入数据并清除空格,然后对式子进行扫描,以三个位单位,发现符合x++,x--,--x,++x的情况就对值进行改变,并替换。而对于字母与数字的关系,利用map映照容器建立映射,由于前置和后置对于计算是有不同影响的。使用value存储字母的最终值,用copyvalue存储计算时的字母值,分开存储,输出结果也分开输出,这样思路很直观。

//327 - Evaluating Simple C Expressions#include <iostream>#include <string>#include <map>#include <cctype>#include <queue>#include <algorithm>using namespace std;char check(string &, map<char, int> &, map<char, int> &, int);int main(){//freopen("data.txt", "r", stdin);string expression, copy;while (getline(cin, expression, '\n')){cout << "Expression: " << expression << endl;for(int i = 0; i < expression.length(); i++)//预处理,除去所有空格if(expression[i] == ' ')expression.erase(i--, 1);map<char, int> value, CopyValue;//value存储最终每个字母的值,CopyValue存储参与计算式字母的值for(int i = 0; i < 26; i++)//建立字母与数字的映射value['a' + i] = i + 1;CopyValue = value;//建立副本,for(int i = 0; i + 2 < expression.length(); i++)//到字符最后第三位即可{char c = check(expression, value, CopyValue, i);//逐次扫描3个连续字符,返回被改变的字母if(c != 0)expression.replace(i, 3, 1, c);}int sum = CopyValue[expression[0]];for(int i = 1; i + 1 < expression.length(); i++){char o = expression[i], x = expression[i + 1];if(o == '+')sum += CopyValue[x];elsesum -= CopyValue[x];}printf("    value = %d\n", sum);sort(expression.begin(), expression.end());for(int i = 0; i < expression.length(); i++)if(isalpha(expression[i]))printf("    %c = %d\n", expression[i], value[expression[i]]);}}char check(string &s, map<char, int> &v, map<char, int> &cv,int i){if(isalpha(s[i]) && s[i + 1] == '+' && s[i + 2] == '+')//判断x++{v[s[i]]++;return s[i];}else if(isalpha(s[i]) && s[i + 1] == '-' && s[i + 2] == '-')//判断x--{v[s[i]]--;return s[i];}else if(isalpha(s[i + 2]) && s[i + 1] == '+' && s[i] == '+')//判断++x,前置式对计算结果有影响,所以对于副本值也要改变{v[s[i + 2]]++;cv[s[i + 2]]++;return s[i + 2];}else if(isalpha(s[i + 2]) && s[i + 1] == '-' && s[i] == '-')//判断--x,前置式对计算结果有影响,所以对于副本值也要改变{v[s[i + 2]]--;cv[s[i + 2]]--;return s[i + 2];}elsereturn 0;}


0 0
原创粉丝点击