/* coder: ACboy date: 2010-3-14 result: 1A description: UVa 327 Evaluating Simple C Expressions */ #include <iostream> #include <algorithm> using namespace std; struct Node { char name; int value; int lastValue; int pos; }; int cmp(const Node & a, const Node & b) { return a.name < b.name; } Node data[30]; int vis[256]; int main() { char input[256]; char temp[256]; char Temp[256]; #ifndef ONLINE_JUDGE freopen("327.txt", "r", stdin); #endif while (gets(input)) { int i, j; int c = 0; int count = 0; int len = strlen(input); for (i = 0; i < len; i++) { if (input[i] != ' ') { temp[c++] = input[i]; if (isalpha(input[i])) { data[count].name = input[i]; data[count].value = input[i] - 'a' + 1; data[count].lastValue = data[count].value; data[count].pos = c - 1; count++; } } temp[c] = '/0'; } memset(vis, 0, sizeof(vis)); for (i = 0; i < count; ++i) { int pos = data[i].pos; if (pos - 2 >= 0) { if (temp[pos - 1] == temp[pos - 2] && temp[pos - 1] == '-') { data[i].value--; data[i].lastValue = data[i].value; vis[pos - 1] = 1; vis[pos - 2] = 1; } if (temp[pos - 1] == temp[pos - 2] && temp[pos - 1] == '+') { data[i].value++; data[i].lastValue = data[i].value; vis[pos - 1] = 1; vis[pos - 2] = 1; } } if (pos + 2 < len) { if (temp[pos + 1] == temp[pos + 2] && temp[pos + 1] == '-') { data[i].lastValue = data[i].value - 1; vis[pos + 1] = vis[pos + 2] = 1; } if (temp[pos + 1] == temp[pos + 2] && temp[pos + 1] == '+') { data[i].lastValue = data[i].value + 1; vis[pos + 1] = vis[pos + 2] = 1; } } } c = 0; for (i = 0; i < len; ++i) { if (!vis[i]) { Temp[c++] = temp[i]; } } Temp[c] = '/0'; len = strlen(Temp); int value = 0; for (i = 0, j = 0; i < len; i += 2, j++) { if (i == 0) value += data[j].value; else { if (Temp[i - 1] == '-') { value -= data[j].value; } else { value += data[j].value; } } } cout << "Expression: " << input << endl; cout << " value = " << value << endl; sort(data, data + count, cmp); for (i = 0; i < count; i++) { cout << " " << data[i].name << " = " << data[i].lastValue << endl; } } return 0; }