Advertisement
Guest User

Untitled

a guest
Jan 17th, 2020
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4. #include <functional>
  5. #include <memory>
  6. #include <numeric>
  7.  
  8. struct EvalBracket
  9. {
  10.     using IntPtr = std::shared_ptr<int>;
  11.     using IncrementFunc = std::function<IntPtr()>;
  12.  
  13.     void AddBracket( char openBracket, char closeBracket )
  14.     {
  15.         auto counter = std::make_shared<int>(0);
  16.         m_brackets[openBracket]  = [counter]()
  17.         {
  18.             if( (*counter) >= 0 )
  19.             {
  20.                 (++(*counter));
  21.             }
  22.             return counter;
  23.         };
  24.  
  25.         m_brackets[closeBracket] = [counter]()
  26.         {
  27.             (--(*counter));
  28.             return counter;
  29.         };
  30.  
  31.         m_counters.emplace_back(std::move(counter));
  32.     }
  33.  
  34.     bool Evaluate(const std::string& expression)
  35.     {
  36.         for(const auto& counter : m_counters)
  37.         {
  38.             (*counter) = 0;
  39.         }
  40.  
  41.         for(auto c : expression)
  42.         {
  43.             auto iter = m_brackets.find(c);
  44.             if( iter != m_brackets.end() )
  45.             {
  46.                 iter->second();
  47.             }
  48.         }
  49.  
  50.         bool result = true;
  51.         for(const auto& counter : m_counters)
  52.         {
  53.             result &= (*counter) == 0;
  54.         }
  55.         return result;
  56.     }
  57.  
  58. private:
  59.     std::vector<IntPtr> m_counters;
  60.     std::map<char, IncrementFunc> m_brackets;
  61. };
  62.  
  63. int main()
  64. {
  65.     std::string expression;
  66.     std::cin >> expression;
  67.  
  68.     std::vector<int> counter(3, 0);
  69.     for(char c : expression)
  70.     {
  71.         if(counter[0] >= 0){ counter[0] += (c == '{') ? 1 : (c == '}') ? (-1) : 0; }
  72.         if(counter[1] >= 0){ counter[1] += (c == '[') ? 1 : (c == ']') ? (-1) : 0; }
  73.         if(counter[2] >= 0){ counter[2] += (c == '(') ? 1 : (c == ')') ? (-1) : 0; }
  74.     }
  75.    
  76.     bool result = true;
  77.     for(auto c : counter)
  78.     {
  79.         if( c != 0 )
  80.         {
  81.             result = false;
  82.             break;
  83.         }
  84.     }
  85.  
  86.     std::cout << std::boolalpha << result << std::endl;
  87.  
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement