UVA-327
题意:给出表达式,求最后的结果和每个变量最后的值。保证不会有a+++b这类有二义的情况。a=1,b=2 ……z=26。
解题思路:可以先把++,–用其他符号存入,对整个算式以+-号分割若干个区域(每个区域只会有一个值,并且是以分割它的两个+-号中前面那个作为符号进行运算)。
/*************************************************************************
> File Name: UVA-327.cpp
> Author: Narsh
>
> Created Time: 2016年07月19日 星期二 14时43分30秒
************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
struct node {
char c;
int x;
} w[60000];
int n,l,r;
string s;
int main() {
while (getline(cin,s)) {
l = s.length();
cout<<"Expression: "<<s<<endl;
n=0;
for (int i = 0; i < l; i++)
if (s[i] == '+' || s[i] == '-') {
if (s[i+1] == s[i]) {
if (s[i] == '+') w[++n].c='*';
else w[++n].c='/';
i++;
}else w[++n].c=s[i];
}else if ('a' <= s[i] && s[i] <= 'z') {
w[++n].c=s[i];
w[n].x=s[i]-'a'+1;
}
int sum=0;
l=0;w[0].c='+';
while (l<n) {
r=l+1;
while (w[r].c != '-' && w[r].c != '+' && r<=n ) r++;
int k=1;
if (w[l].c == '-') k=-1;
for (int i = l+1; i < r; i++) {
if (w[i].c == '*' && i+1 < r) w[i+1].x++;
if (w[i].c == '*' && i+1 >= r) w[i-1].x++;
if (w[i].c == '/' && i+1 < r) w[i+1].x--;
if (w[i].c == '/' && i+1 >= r) w[i-1].x--;
if (w[i].c >= 'a' && w[i].c <= 'z') sum+=k*w[i].x;
}
l=r;
}
printf(" value = %d\n",sum);
for (char i = 'a'; i <= 'z'; i++)
for (int z = 1; z <= n; z++)
if (w[z].c == i)
printf(" %c = %d\n",i,w[z].x);
}
}