Advertisement
bojandam1

Resavac Na Matematicki Vlez

Nov 30th, 2023
892
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <stack>
  3. #include <list>
  4. #include <sstream>
  5. #include<cmath>
  6. using namespace std;
  7.  
  8. enum Type {
  9.     Number, Operator, Brace, Unary, Defualt
  10. };
  11.  
  12. struct Element {
  13.     Type type;
  14.     float value;
  15.     Element() { type = Defualt; value = 0; }
  16.     Element(Type type, float value) {
  17.         this->type = type;
  18.         this->value = value;
  19.     }
  20. };
  21.  
  22. ostream & operator<<(std::ostream & os, const Element & m) {
  23.     switch (m.type)
  24.     {
  25.     case Number:
  26.         os << m.value << " ";
  27.         break;
  28.     case Brace:
  29.         os << ((m.value == 1) ? ("(") : (")")) << " ";
  30.         break;
  31.     case Operator:
  32.         switch ((int)m.value)
  33.         {
  34.         case 1: os << "+ "; break;
  35.         case 2: os << "- "; break;
  36.         case 3: os << "* "; break;
  37.         case 4: os << "/ "; break;
  38.         default:
  39.             break;
  40.         }
  41.         break;
  42.     case Unary:
  43.         os << "_ ";
  44.         break;
  45.     default:
  46.         os << "ERR ";
  47.         break;
  48.     }
  49.     return os;
  50. }
  51.  
  52. int OperToNum(char c) {
  53.     switch (c)
  54.     {
  55.     case '+':
  56.         return 1;
  57.         break;
  58.     case '*':
  59.         return 3;
  60.         break;
  61.     case '/':
  62.         return 4;
  63.         break;
  64.     }
  65. }
  66.  
  67. int main()
  68. {
  69.     stack<char> stk;
  70.     stack<list<Element>::iterator> Stack;
  71.     list<Element> lis;
  72.     string str;
  73.     getline(cin, str);
  74.     bool ValidZagradi = true;
  75.  
  76.     for (char i : str)
  77.     {
  78.         if (i == '(' || i == '[' || i == '{')
  79.             stk.push(i);
  80.  
  81.         if (i == ')')
  82.             if (!stk.empty() && stk.top() == '(') stk.pop();
  83.             else ValidZagradi = false;
  84.         if (i == ']')
  85.             if (!stk.empty() && stk.top() == '[') stk.pop();
  86.             else ValidZagradi = false;
  87.         if (i == '}')
  88.             if (!stk.empty() && stk.top() == '{') stk.pop();
  89.             else ValidZagradi = false;
  90.     }
  91.     if (ValidZagradi == false || !stk.empty())
  92.         cout << "Loshi Zagradi\n";
  93.     else {
  94.         bool VnesuvaBr = false;
  95.         float VlezenBr = 0.0f;
  96.         lis.push_back(Element(Brace, 1));
  97.         for (int i = 0; i < str.size(); i++) {
  98.             char c = str[i];
  99.             if (c >= '0' && c <= '9') {
  100.                 VnesuvaBr = true;
  101.                 VlezenBr *= 10;
  102.                 VlezenBr += c - '0';
  103.  
  104.                 if (i + 1 >= str.size() || str[i + 1] < '0' || str[i + 1]>'9') {
  105.                     lis.push_back(Element(Number, VlezenBr));
  106.                     VlezenBr = 0; VnesuvaBr = false;
  107.                 }
  108.             }
  109.             if (c == '+' || c == '*' || c == '/') {
  110.                 lis.push_back(Element(Operator, OperToNum(c)));
  111.             }
  112.             if (c == '(' || c == '[' || c == '{') {
  113.                 lis.push_back(Element(Brace, 1));
  114.             }
  115.             if (c == ')' || c == ']' || c == '}') {
  116.                 lis.push_back(Element(Brace, 2));
  117.             }
  118.             if (c == '-') {
  119.                 if (lis.size() == 1 || ((--lis.end()))->type != Number && !((--lis.end())->type == Brace && (--lis.end())->value == 2))
  120.                     lis.push_back(Element(Unary, 1));
  121.                 else
  122.                     lis.push_back(Element(Operator, 2));
  123.             }
  124.         }
  125.         lis.push_back(Element(Brace, 2));
  126.  
  127.         for (list<Element>::iterator it = lis.begin(); it != lis.end(); it++) {
  128.  
  129.             if (it->type == Brace) {
  130.                 if (it->value == 1) {
  131.                     Stack.push(it);
  132.                 }
  133.                 else {
  134.                     list<Element>::iterator LeftBracket = Stack.top(), RightBracket = it; Stack.pop();
  135.  
  136.                     //Presmetuvanje na Unaren Minus
  137.  
  138.                     for (list<Element>::iterator El = LeftBracket; El != RightBracket; El++) {
  139.                         if (El->type == Unary) {
  140.                             list<Element>::iterator Num = El; Num++;
  141.                             if (Num->type != Number) {
  142.                                 cout << "GRESHEN IZRAZ"; return 0;
  143.                             }
  144.                             Num->value *= -1;
  145.                             lis.erase(El);
  146.                             El = Num;
  147.                         }
  148.                     }
  149.  
  150.                     //Presmetuvanje na * i /
  151.                     for (list<Element>::iterator El = LeftBracket; El != RightBracket; El++) {
  152.                         if (El->type == Operator && El->value > 2) {
  153.                             list<Element>::iterator Numl = El, Numr = El; Numr++; Numl--;
  154.                             if (Numr->type != Number || Numl->type != Number)
  155.                             {
  156.                                 cout << "GRESHEN IZRAZ"; return 0;
  157.                             }
  158.                             if (El->value == 3)Numl->value *= Numr->value;
  159.                             else if (El->value == 4) Numl->value /= Numr->value;
  160.                             else {
  161.                                 cout << "GRESHEN IZRAZ"; return 0;
  162.                             }
  163.                             lis.erase(El);
  164.                             lis.erase(Numr);
  165.                             El = Numl;
  166.                         }
  167.                     }
  168.                     //Presmetuvanje na + i bin -
  169.                     for (list<Element>::iterator El = LeftBracket; El != RightBracket; El++) {
  170.                         if (El->type == Operator && El->value <= 2) {
  171.                             list<Element>::iterator Numl = El, Numr = El; Numr++; Numl--;
  172.                             if (Numr->type != Number || Numl->type != Number)
  173.                             {
  174.                                 cout << "GRESHEN IZRAZ"; return 0;
  175.                             }
  176.                             if (El->value == 2)Numl->value -= Numr->value;
  177.                             else if (El->value == 1) Numl->value += Numr->value;
  178.                             else {
  179.                                 cout << "GRESHEN IZRAZ"; return 0;
  180.                             }
  181.                             lis.erase(El);
  182.                             lis.erase(Numr);
  183.                             El = Numl;
  184.                         }
  185.                     }
  186.                     //Brishenje na zagradi
  187.                     list<Element>::iterator Num = RightBracket; Num--;
  188.                     lis.erase(LeftBracket);
  189.                     lis.erase(RightBracket);
  190.                     it = Num;
  191.  
  192.  
  193.                 }
  194.             }
  195.         }
  196.  
  197.         for (Element el : lis) {
  198.             cout << el;
  199.         }cout << endl;
  200.  
  201.     }
  202. }
  203.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement