(字符串的处理4.7.22)POJ 3337 Expression Evaluator(解析C风格的字符串)
/* * POJ_3337.cpp * * Created on: 2013年10月29日 * Author: Administrator */#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 10010;int data[26];//用来存储每一个字母所对应的数字char opr[maxn];//去掉空格后的表达式char opr1[maxn];//去掉空格钱的表达式bool vst[maxn];//用来标记某一个字符是否已经访问过void init() {int i;for (i = 0; i < 26; ++i) {data[i] = i + 1;}memset(vst, 0, sizeof(vst));}int main() {int ans;int t;int i, j;scanf("%d", &t);getchar();//调用gets()之前尽量加上这一句while (t--) {init();ans = 0;bool flag = false;gets(opr1);int len = strlen(opr1);for (i = 0, j = 0; i < len; i++) { //去掉空格if (opr1[i] != ' ') {opr[j] = opr1[i];j++;}}for (i = 0; i < j; ++i) {if (flag == false) { //6种情况if (opr[i] >= 'a' && opr[i] <= 'z') { //如果是字母if (i - 2 >= 0 && opr[i - 2] == '+' && opr[i - 1] == '+') { //++adata[opr[i] - 'a']++;ans = data[opr[i] - 'a'];vst[opr[i] - 'a'] = true;} else if (i - 2 >= 0 && opr[i - 2] == '-'&& opr[i - 1] == '-') { //--adata[opr[i] - 'a']--;ans = data[opr[i] - 'a'];vst[opr[i] - 'a'] = true;} else if (opr[i + 2] == '+' && opr[i + 1] == '+') { //a++ans = data[opr[i] - 'a']++;vst[opr[i] - 'a'] = true;} else if (opr[i + 2] == '-' && opr[i + 1] == '-') { //a--ans = data[opr[i] - 'a']--;vst[opr[i] - 'a'] = true;} else if (opr[i - 1] == '-') { //-aans = -data[opr[i] - 'a'];vst[opr[i] - 'a'] = true;} else { //+aans = data[opr[i] - 'a'];vst[opr[i] - 'a'] = true;}flag = true;}} else { //8种: b-++a b+--a b-a++ b-a-- b+a++ b+a-- -a +aif (opr[i] >= 'a' && opr[i] <= 'z') {if (i - 4 >= 0 && opr[i - 2] == '+' && opr[i - 1] == '+'&& opr[i - 3] == '-') { //b-++aans = ans - (++data[opr[i] - 'a']);vst[opr[i] - 'a'] = true;} else if (i - 4 >= 0 && opr[i - 2] == '-'&& opr[i - 1] == '-' && opr[i - 3] == '+') { //b+--aans = ans + (--data[opr[i] - 'a']);vst[opr[i] - 'a'] = true;} else if (opr[i + 1] == '+' && opr[i + 2] == '+') {if (opr[i - 1] == '-') { //b-a++ans = ans - data[opr[i] - 'a'];data[opr[i] - 'a']++;vst[opr[i] - 'a'] = true;}if (opr[i - 1] == '+') { //b+a++ans = ans + data[opr[i] - 'a'];data[opr[i] - 'a']++;vst[opr[i] - 'a'] = true;}} else if (opr[i + 1] == '-' && opr[i + 2] == '-') {if (opr[i - 1] == '+') { //b+a--ans = ans + data[opr[i] - 'a'];data[opr[i] - 'a']--;vst[opr[i] - 'a'] = true;}if (opr[i - 1] == '-') { //b-a--ans = ans - data[opr[i] - 'a'];data[opr[i] - 'a']--;vst[opr[i] - 'a'] = true;}} else if (opr[i - 1] == '-') { //-aans = ans - data[opr[i] - 'a'];vst[opr[i] - 'a'] = true;} else if (opr[i - 1] == '+') { //+aans = ans + data[opr[i] - 'a'];vst[opr[i] - 'a'] = true;}}}}printf("Expression: %s\n", opr1);//注意这里输出的是opr1,而不是opr,因为opr已经被处理过printf("value = %d\n", ans);for (i = 0; i < 26; ++i) {if (vst[i]) {printf("%c = %d\n", i + 'a', data[i]);}}}return 0;}