第一次参加编程比赛,虽然只AC了一道题,但是还是挺开心的,这道题还是基础的运算符操作,比较基础
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <map>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
void process(vector<string>& split, map<string, int>& char2int) {
stack<string> result;
for (int i = 0; i < split.size(); i++)
{
if (isdigit(split[i][0]))
{
int sum =0;
if (isdigit((result.top())[0]))
sum = atoi(result.top().c_str()) * atoi(split[i].c_str());
else
sum = char2int[result.top()]*atoi(split[i].c_str());
result.pop();
while (!result.empty() && result.top() != "(")
{
if(isdigit((result.top())[0]))
sum = sum + atoi(result.top().c_str());
else
sum = sum + char2int[result.top()];
result.pop();
}
result.push(to_string(sum));
}
else if ((split[i] == "(") || (split[i][0] >= 'A'&&split[i][0] <= 'Z')) {
result.push(split[i]);
}
else //split[i] == ")"
{
int sum = 0;
while (result.top() != "(") {
if (isdigit((result.top())[0]))
sum = sum + atoi(result.top().c_str());
else
sum += char2int[result.top()];
result.pop();
}
result.pop();
result.push(to_string(sum));
}
}
int sum = 0;
while (!result.empty())
{
if (isdigit((result.top())[0]))
sum = sum + atoi(result.top().c_str());
else
sum = sum + char2int[result.top()];
result.pop();
}
cout<<sum<<endl;
}
int main()
{
string s;
map<string, int> char2int;
char2int["N"] = 14;
char2int["C"] = 12;
char2int["O"] = 16;
char2int["Cl"] = 35;
char2int["S"] = 32;
char2int["H"] = 1;
char2int["Al"] = 27;
char2int["Ca"] = 40;
char2int["Zn"] = 65;
char2int["Na"] = 23;
while (cin >> s) {
vector<string> split;
int start = 0;
int end = 0;
while (start < s.size() && end < s.size()) {
if (isdigit(s[start])) {
while (isdigit(s[end])) {
end++;
}
split.push_back(s.substr(start, end - start));
}
else if (s[start] == '(' || s[start] == ')')
{
split.push_back(s.substr(start,1));
end++;
}
else {
string temp = s.substr(start, 2);
if (char2int.find(temp) != char2int.end())
{
split.push_back(temp);
end += 2;
}
else {
split.push_back(s.substr(start, 1));
end += 1;
}
}
start = end;
}
/*
for (int i = 0; i < split.size(); i++)
{
if (split[i][0] >= 'A'&&split[i][0] <= 'Z')
split[i] = to_string(char2int[split[i]]);
cout << split[i] << endl;
}
*/
process(split, char2int);
}
return 1;
}