40 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕реВрддреНрд░

рдХрднреА-рдХрднреА рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдХрд╛рдо (рдЬреИрд╕реЗ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рджрд┐рдП рдЧрдП) рдХреЛ рд▓реЗрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдвреВрдВрдврдирд╛ рд╣реИред
рдЗрд╕ рдмрд╛рд░ рдпрд╣ рдпреИрдВрдбреЗрдХреНрд╕ рд╕реЗ рдРрд╕рд╛ рдХрд╛рдо рдмрди рдЧрдпрд╛ред рдкреЛрд╕реНрдЯ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдХрдИ рд╕рдорд╛рдзрд╛рди рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдП рдЧрдП рдереЗ, рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рд╡рд┐рд╖рдп рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рдПрдХ рд▓рдШреБ рд╕рдорд╛рдзрд╛рди рдХреА рдЦреЛрдЬ рд╣реЛрдЧрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ - рдпрд╣ рд░рд┐рд╡рд░реНрд╕ рдкреЛрд▓рд┐рд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реЛрдЧреАред рд╣рдо рд╕реНрд╡рдпрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдореВрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рддреБрд░рдВрдд рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗред рд╣рдо рджреЛ рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ - рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдПред рдПрдХ рд╕рд╣рдпреЛрдЧреА рд╕рд░рдгреА рднреА рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рдСрдкрд░реЗрд╢рди рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рдХреЛрд╖реНрдардХ рдЦреЛрд▓рддреЗ рд╕рдордп, рд╣рдо рдХреЛрд╖реНрдардХ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдмрдврд╝рд╛рдПрдВрдЧреЗ, рдФрд░ рдЬрдм рдмрдВрдж рдХрд░реЗрдВрдЧреЗ, рддреЛ рд╣рдо рдХрдо рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдмреНрд░реИрдХреЗрдЯ рдЦреБрдж рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдирд╣реАрдВ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╛рдирдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдФрд░ рд░рд┐рд╡рд░реНрд╕ рдкреЛрд▓рд┐рд╢ рдЕрдВрдХрди рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЧрдгрдирд╛ред

рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рд╣реИ:
#include <iostream> #include <map> #include <stack> #include <functional> #include <utility> #include <stdlib.h> using namespace std; int main(int argc, char** argv) { stack<double> s; stack< pair<int, char> > ops; auto p = [&s, &ops] (function<double (double, double)>& f) {double r=s.top();s.pop();r=f(s.top(),r);s.pop();s.push(r);ops.pop();}; map< char, pair< int, function<double (double, double)> > > m = {{'+', {1, [](double a, double b){return a+b;}}},{'-', {1, [](double a, double b){return ab;}}}, {'*', {2, [](double a, double b){return a*b;}}},{'/', {2, [](double a, double b){return a/b;}}}}; const int order = 2; int level = 0; for (char* sp = argv[1];; ++sp) { while (*sp == '(') {level += order; ++sp;} s.push(strtod(sp, &sp)); while (*sp == ')') {level -= order; ++sp;} if (!*sp) {while(!ops.empty()) p(m[ops.top().second].second); break;} const int op = m[*sp].first + level; while (!ops.empty() && ops.top().first >= op) p(m[ops.top().second].second); ops.push(make_pair(op, *sp)); } cout << s.top() << endl; return 0; } 


рдЪрд▓ рд░рд╣рд╛ рд╣реИ:
 ./calc "15/(7-(1+1))*3-(2+(1+1))" 5 


Source: https://habr.com/ru/post/In216449/


All Articles