无标题

Run Settings
LanguageC++
Language Version
Run Command
#include<string> #include<cctype> #include<iostream> #include<utility> #include <functional> #include<vector> using namespace std; /*parser<pair<T1, T2>> seq(parser<T1> f1, parser<T2> f2) { return[=](string &s, pair<T1, T2> &out) { string w = s; T1 a; T2 b; if (!f1(s, a)) { s = w; return false; } if (!f2(s, b)) { s = w; return false; } out.first = a; out.second = b; return true; }; }*/ /* int main() { string s; cin >> s; int a; pair<int, vector<pair<char, int>>> soul; if (star(s, soul)) { a = soul.first; for (auto v : soul.second) { if (v.second == '+') a += v.first; if (v.second == '-') a -= v.first; } } cout << a << endl; system("pause"); }*/ bool getint(string &s, int &a) { int ret = 0; if (s.size() == 0 || !isdigit(s[0])) return false; for (int i = 0, n = (int)s.size(); i < n; i++) { if (isdigit(s[i])) ret = ret * 10 + s[i] - '0'; else { s = s.substr(i); a = ret; return true; } } s = ""; a = ret; return true; } bool getop(string &s, char &a) { if (s.size() == 0 || !isgraph(s[0])) return false; switch (s[0]) { case '+': a = '+'; s = s.substr(1); return true; break; case '-': a = '-'; s = s.substr(1); return true; break; case '*': a = '*'; s = s.substr(1); return true; break; case '/': a = '/'; s = s.substr(1); return true; default: return false; break; } } template<typename T> auto star=[](auto f1) { return [=](string &s,vector<T> &out) { T a; while (f1(s,a)) { out.push_back(a); } return true; }; }; auto seq = [](auto f1, auto f2) { return [=](string &s, auto &out) { string w = s; decltype(out.first) a; decltype(out.second) b; if (!f1(s, a)) { s = w; return false; } if (!f2(s, b)) { s = w; return false; } out.first = a; out.second = b; return true; }; }; /*template<typename T> auto stl = [](auto f1, auto f2) { return[=](string &s, pair<int,vector<T>> &out) { decltype(out.first) b; decltype(out.second) q; decltype(out) a; string w = s; if (!f1(s, b)) { s = w; return false; } a.first = b; if (!f2(s, q)) { s = w; return false; } a.second =q; out = a; }; };*/ int main() { string s; cin >> s; auto expr =seq(getint, star<pair<char,int>>(seq(getop, getint))); pair <int, vector<pair<char, int>>> result; expr(s, result); cout << result.first << endl; int a = result.first; for (auto x : result.second) { if (x.first == '+') a += x.second; if (x.first == '-') a -= x.second; } cout << a << endl; system("pause"); return 0; }
Editor Settings
Theme
Key bindings
Full width
Lines