Guest User

Untitled

a guest
Nov 24th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 KB | None | 0 0
  1. #include <stack>
  2. #include <string>
  3. #include <vector>
  4. #include <iostream>
  5. #include <unordered_map>
  6.  
  7.  
  8. template<typename T>
  9. class balancedBrackets
  10. {
  11. enum class bracketType { OPENING, CLOSING };
  12. std::unordered_map<T, bracketType> mBracketIdentifiers;//which bracket symbol is the opening character and which is the closing character
  13. std::unordered_map<T, T> mBracketPairs;//which bracket symbol matches with which other
  14. public:
  15. balancedBrackets(){}
  16. balancedBrackets(std::initializer_list< std::pair<T, T> > pairs)
  17. {
  18. addBracketPairs(pairs);
  19. }
  20.  
  21. void addBracketPairs(std::initializer_list< std::pair<T, T> > pairs)
  22. {
  23. for (auto elem : pairs)
  24. {
  25. if (mBracketIdentifiers.find(elem.first) != mBracketIdentifiers.end() ||
  26. mBracketIdentifiers.find(elem.second) != mBracketIdentifiers.end())
  27. {
  28. continue;//if any member of this bracket pair already exist, skip.
  29. }
  30. mBracketPairs.emplace(elem);
  31. mBracketIdentifiers.emplace(elem.first, bracketType::OPENING);
  32. mBracketIdentifiers.emplace(elem.second, bracketType::CLOSING);
  33. }
  34. }
  35.  
  36. void removeBracketPairs(std::initializer_list< std::pair<T, T> > pairs)
  37. {
  38. for (auto elem : pairs)
  39. {
  40. auto search = mBracketPairs.find(elem.first);
  41. if (search != mBracketPairs.end() && search->second == elem.second)//is this a valid pair?
  42. {
  43. mBracketPairs.erase(search);
  44. mBracketIdentifiers.erase(elem.first);
  45. mBracketIdentifiers.erase(elem.second);
  46. }
  47. }
  48. }
  49.  
  50. void clearBracketPairs()
  51. {
  52. mBracketPairs.clear();
  53. mBracketIdentifiers.clear();
  54. }
  55.  
  56. bool isBalanced(std::vector<T> expression)
  57. {
  58. if (mBracketPairs.empty())//no bracket rules
  59. {
  60. throw std::logic_error("no bracket rules");
  61. }
  62.  
  63. std::stack<T> myStack;
  64. for (auto elem : expression)
  65. {
  66. if (mBracketIdentifiers[elem] == bracketType::OPENING)
  67. {
  68. myStack.push(elem);
  69. }
  70. else
  71. {
  72. if (mBracketIdentifiers[elem] == bracketType::CLOSING)
  73. {
  74. if (!myStack.empty() && mBracketPairs[myStack.top()] == elem)//do not call top on an empty stack
  75. {
  76. myStack.pop();
  77. }
  78. else //imbalanced text
  79. {
  80. return false;
  81. }
  82. }
  83. else //invalid characters
  84. {
  85. return false;
  86. }
  87. }
  88. }
  89. return myStack.empty();
  90. }
  91. bool isBalanced(std::basic_string<T> expression)//make this class work with std::string family too.
  92. {
  93. return isBalanced(std::vector<T>(expression.begin(), expression.end()));
  94. }
  95. };
  96.  
  97. int main()
  98. {
  99. balancedBrackets<char> a({ { '{','}' } ,{ '[',']' },{ '(',')' } });
  100. a.isBalanced(std::string("{{[[(())]]}}"));
  101. return 0;
  102. }
Add Comment
Please, Sign In to add comment