Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ซิกแซก Iterator ใน C ++


สมมติว่ามีอาร์เรย์ 1D สองชุด เราต้องใช้ตัววนซ้ำเพื่อส่งคืนองค์ประกอบสลับกัน จะมีสองวิธี -

  • next() − เพื่อรับองค์ประกอบถัดไป

  • hasNext() - เพื่อตรวจสอบว่าองค์ประกอบถัดไปมีอยู่หรือไม่

ดังนั้นหากอินพุตเป็นเหมือน v1 =[1,2] v2 =[3,4,5,6] ผลลัพธ์จะเป็น [1,3,2,4,5,6]

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดหนึ่งคิว q ของคู่

  • จากตัวเริ่มต้นใช้สองอาร์เรย์ v1 และ v2

  • ถ้าขนาด v1 แล้ว −

    • แทรก { 0, 0 } ลงใน q

  • ถ้าขนาดของ v2 แล้ว −

    • แทรก { 0, 1 } ลงใน q

  • กำหนดอุณหภูมิหนึ่งคู่

  • temp :=องค์ประกอบแรกของ q

  • ลบองค์ประกอบออกจาก q

  • ยกเลิก :=0

  • ถ้า temp.second เท่ากับ 1 แล้ว −

    • ret :=v2[temp.first]

    • (เพิ่ม temp.first โดย 1)

    • ถ้า temp.first <ขนาด v2 แล้ว −

      • ใส่อุณหภูมิลงใน q

  • มิฉะนั้น

    • ret :=v1[temp.first]

    • (เพิ่ม temp.first โดย 1)

    • ถ้า temp.first <ขนาด v1 แล้ว −

      • ใส่อุณหภูมิลงใน q

  • รีเทิร์น

  • กำหนดฟังก์ชัน hasNext()

  • คืนค่า จริง เมื่อ q ไม่ว่าง

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#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;
}

อินพุต

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

ผลลัพธ์

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