题目很简单就是a代表1,b代表2,去计算式子的值,如果是i++则计算结果的时候不用加,输出数字的时候要加,++i则计算输出都要加1。。
看到题目就想不明白,为什么是树,我采用的是直接模拟。。
做了好久,发现直接模拟情况真的好多。。。默默的流泪写了又臭又长又难看的一段代码,因为几种情况没考虑wa了几次,还好最后A了,不然换别的方法重新写会吐的。。。。。
#include<iostream>
#include<string>
#include<stack>
#include<queue>
#include<map>
using namespace std;
int main () {
map<string, int> m;
queue<int> finalnum;
queue<char> finalchar;
int ma[200];
for (int i = 97 ; i <= 123 ;i++ )
ma[i] = i -96;
string str2;
while(getline (cin ,str2)) {
string str;
int num;
for (int i = 0 ;i < str2.size() ;i++ ) {
if (str2[i] != ' ')
str += str2[i];
}
int flag;
for (int i = 0; i < str.size() ;i++) {
flag = 0;
if (str[i] >= 'a' && str[i] <= 'z') {
num = ma[str[i]];
if (i < str.size() - 2 &&str[i + 1] == '+' && str[i + 2] == '+' && str[i + 3] != '+'){
num = num;
string temp = "";
temp += str[i];
m.insert(pair<string,int>(temp,num + 1));
flag = 1;
}
if (i < str.size() - 2 && str[i + 1] == '-' && str[i + 2] == '-' && str[i + 3] != '-'){
num = num;
string temp = "";
temp += str[i];
m.insert(pair<string,int>(temp,num - 1));
flag = 1;
}
if (flag == 0) {
string temp ="";
temp += str[i];
m.insert(pair<string,int>(temp,num));
}
finalnum.push(num);
}
if (str[i] == '+' || str[i] == '-') {
if(i == 0 && str[0] == '+' && str[1] == '+') {
num = ma[str[i + 2]] + 1;
string temp = "";
temp += str[i + 2];
m.insert(pair<string,int>(temp,num));
finalnum.push(num);
flag = 1;
}
if(i == 0 && str[0] == '-' && str[1] == '-') {
num = ma[str[i + 2]] - 1;
string temp = "";
temp += str[i + 2];
m.insert(pair<string,int>(temp,num));
finalnum.push(num);
flag = 1;
}
if (i < str.size() - 2 && flag != 1&& str[i] == '+' && str[i - 1]== '-' && str[i + 1] == '+' && str[i + 2] >= 'a' &&str[i + 2] <='z') {
num = ma[str[i + 2]] + 1;
string temp = "";
temp += str[i + 2];
m.insert(pair<string,int>(temp,num));
finalnum.push(num);
flag = 1;
}
if (i < str.size() - 2 &&flag !=1 && str[i] == '-' &&str[i - 1] == '+' && str[i + 1] == '-' && str[i + 2] >= 'a' && str[2] <= 'z') {
num = ma[str[i + 2]] - 1;
string temp = "";
temp += str[i + 2];
m.insert(pair<string,int>(temp,num));
finalnum.push(num);
flag = 1;
}
if (flag == 0) {
finalchar.push(str[i]);
}
}
if (flag == 1) {
i += 2;
}
}
int k;
k = finalnum.front();
finalnum.pop();
while (!finalnum.empty()) {
if (finalchar.front() == '+')
k += finalnum.front();
else
k -= finalnum.front();
finalnum.pop();
finalchar.pop();
}
cout<<"Expression: "<< str2 <<endl;
cout<<" value = " << k <<endl;
map<string ,int >::iterator it = m.begin();
for (;it != m.end();it++) {
cout <<" "<< it -> first <<" = "<<it -> second <<endl;
}
m.clear();
}
return 0;
}