fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <sstream>
  5. using namespace std;
  6.  
  7. enum class ElemType
  8. {
  9. VAL,
  10. DOWN,
  11. UP,
  12. NONE
  13. };
  14.  
  15. class Elem
  16. {
  17. public:
  18. Elem(): t(ElemType::VAL), val(0) {}
  19. Elem(const ElemType _t, const int _val): t(_t), val(_val) {}
  20. Elem(const ElemType _t) : Elem(_t, 0) {}
  21.  
  22. ElemType t;
  23. int val;
  24. };
  25.  
  26.  
  27. class MyDS
  28. {
  29. public:
  30. // Initialization Example: [[1,2],3,[4,5],[], [6]]
  31. MyDS(): v({{ElemType::DOWN}, {ElemType::VAL,1}, {ElemType::VAL,2}, {ElemType::UP}, {ElemType::VAL,3}, {ElemType::DOWN}, {ElemType::VAL,4}, {ElemType::VAL,5}, {ElemType::UP}, {ElemType::DOWN}, {ElemType::NONE}, {ElemType::UP}, {ElemType::DOWN}, {ElemType::VAL,6}, {ElemType::UP}}) {}
  32.  
  33. vector<Elem> v;
  34.  
  35. string toStr() const
  36. {
  37. stringstream res;
  38. unsigned int curr_depth=0;
  39.  
  40. bool isComma=false;
  41. for(const auto& e : v)
  42. {
  43. if(e.t == ElemType::DOWN) {res << (isComma?",":"") << "["; isComma=false;}
  44. else if(e.t == ElemType::UP) {res << "]"; isComma=true; }
  45. else if(e.t == ElemType::VAL) {res << ( (isComma)?",":"" ) << e.val; isComma=true;}
  46. else if(e.t == ElemType::NONE) {res << ""; isComma=true;}
  47. }
  48.  
  49. return res.str();
  50. }
  51. };
  52.  
  53. template <typename T>
  54. class MaybeMonad
  55. {
  56. public:
  57. MaybeMonad(const T& _data): isValid(true), data(_data) {}
  58. MaybeMonad() : isValid(false), data(0) {}
  59.  
  60. bool isValid;
  61. T data;
  62.  
  63. string toStr() const
  64. {
  65. if(isValid) return to_string(data);
  66. return "";
  67. }
  68. };
  69.  
  70. class Iterator
  71. {
  72. public:
  73. Iterator(const MyDS& _d) : is_index_valid(false), index(0), d(_d), n_vals(0), tot_n_vals(count()) {}
  74.  
  75.  
  76. bool hasNext() const
  77. {
  78. return n_vals<tot_n_vals;
  79. }
  80.  
  81. MaybeMonad<int> get()
  82. {
  83. //MaybeMonad<int> res;
  84. if(!is_index_valid) {is_index_valid=true; index=0;}
  85. else index++;
  86. if(index == d.v.size()) {throw runtime_error("No more elements"); }
  87.  
  88. while( (d.v[index].t != ElemType::VAL) && (d.v[index].t != ElemType::NONE) )
  89. {
  90. index++;
  91. if(index == d.v.size()) {throw runtime_error("No more elements");}
  92. }
  93.  
  94. n_vals++;
  95. if(d.v[index].t == ElemType::VAL) return MaybeMonad<int>(d.v[index].val);
  96. index++;
  97. return MaybeMonad<int>();
  98. }
  99.  
  100. private:
  101.  
  102. // Just get the reference, do not copy it
  103. const MyDS& d;
  104.  
  105. bool is_index_valid;
  106. unsigned int index;
  107. unsigned int n_vals;
  108. unsigned int tot_n_vals;
  109.  
  110.  
  111. // O(N) loop to count the actual elements
  112. unsigned int count() const
  113. {
  114. unsigned int res=0;
  115. for(const auto& e : d.v) res += ( (e.t == ElemType::VAL) || (e.t == ElemType::NONE) )?1:0;
  116. return res;
  117. }
  118. };
  119.  
  120. int main() {
  121. // your code goes here
  122. MyDS d;
  123. cout << d.toStr() << endl;
  124. Iterator it(d);
  125. while(it.hasNext()) cout << it.get().toStr() << ",";
  126. cout << endl;
  127. return 0;
  128. }
  129.  
  130.  
  131.  
  132.  
  133.  
Success #stdin #stdout 0s 4280KB
stdin
Standard input is empty
stdout
[1,2],3,[4,5],[],[6]
1,2,3,4,5,,6,