(字符串的处理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] == '+') { //++a data[opr[i] - 'a']++; ans = data[opr[i] - 'a']; vst[opr[i] - 'a'] = true; } else if (i - 2 >= 0 && opr[i - 2] == '-' && opr[i - 1] == '-') { //--a data[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] == '-') { //-a ans = -data[opr[i] - 'a']; vst[opr[i] - 'a'] = true; } else { //+a ans = 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 +a if (opr[i] >= 'a' && opr[i] <= 'z') { if (i - 4 >= 0 && opr[i - 2] == '+' && opr[i - 1] == '+' && opr[i - 3] == '-') { //b-++a ans = 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+--a ans = 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] == '-') { //-a ans = ans - data[opr[i] - 'a']; vst[opr[i] - 'a'] = true; } else if (opr[i - 1] == '+') { //+a ans = 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; }