Zigzag Iterator in C++


Suppose there are two 1D arrays, we have to implement an iterator that will return their elements alternately. There will be two methods −

  • next() − to get next element

  • hasNext() − to check whether the next element is present or not.

So, if the input is like v1 = [1,2] v2 = [3,4,5,6] , then the output will be [1,3,2,4,5,6],

To solve this, we will follow these steps −

  • Define one queue q of pairs

  • From the initializer ake two arrays v1 and v2,

  • if size of v1, then −

    • insert { 0, 0 } into q

  • if size of v2, then −

    • insert { 0, 1 } into q

  • Define one pair temp

  • temp := first element of q

  • delete element from q

  • ret := 0

  • if temp.second is same as 1, then −

    • ret := v2[temp.first]

    • (increase temp.first by 1)

    • if temp.first < size of v2, then −

      • insert temp into q

  • Otherwise

    • ret := v1[temp.first]

    • (increase temp.first by 1)

    • if temp.first < size of v1, then −

      • insert temp into q

  • return ret

  • Define a function hasNext()

  • return true when q is not empty

Example 

Let us see the following implementation to get better understanding −

 Live Demo

#include <bits/stdc++.h>
using namespace std;
class ZigzagIterator {
public:
   queue <pair<int, int>> q;
   vector <int< v1, v2;
   ZigzagIterator(vector<int<& v1, vector<int<& v2) {
      this->v1 = v1;
      this->v2 = v2;
      if (v1.size()) {
         q.push({ 0, 0 });
      }
      if (v2.size()) {
         q.push({ 0, 1 });
      }
   }
   int next() {
      pair<int, int> temp;
      temp = q.front();
      q.pop();
      int ret = 0;
      if (temp.second == 1) {
         ret = v2[temp.first];
         temp.first++;
         if (temp.first < v2.size())
            q.push(temp);
      }
      else {
         ret = v1[temp.first];
         temp.first++;
         if (temp.first < v1.size())
            q.push(temp);
      }
      return ret;
   }
   bool hasNext() {
      return !q.empty();
   }
};
main(){
   vector<int< v1 = {1,3,5,7}, v2 = {2,4,6,8,10,12,17};
   ZigzagIterator ob(v1, v2);
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.hasNext() ? "True" : "False") << endl;
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.hasNext() ? "True" : "False") << endl;
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.hasNext() ? "True" : "False") << endl;
   cout << (ob.next()) << endl;
   cout << (ob.next()) << endl;
   cout << (ob.hasNext() ? "True" : "False") << endl;
}

Input

{1,3,5,7},{2,4,6,8,10,12,17}

Output

1
2
True
3
4
5
True
6
7
8
10
True
12
17
False

Updated on: 18-Nov-2020

169 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements