สมมติว่าเราต้องการออกแบบ Phone Directory ที่รองรับการทำงานดังต่อไปนี้ -
-
get - จะให้หมายเลขที่ไม่ได้กำหนดให้กับใครเลย
-
ตรวจสอบ - นี้จะตรวจสอบว่ามีหมายเลขหรือไม่
-
release - สิ่งนี้จะรีไซเคิลหรือปล่อยหมายเลข
โดยใช้ initializer เราสามารถเริ่มต้นได้ n ตัวเลขในตอนแรก
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดหนึ่งชุด s
-
กำหนดคิวว่าง
-
ตัวเริ่มต้นจะใช้ maxNumbers
-
ไม่มี :=maxNumbers
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
ใส่ i เข้าไป
-
-
กำหนดฟังก์ชัน get()
-
ถ้าขนาดของที่มีอยู่เท่ากับ 0 แล้ว −
-
กลับ -1
-
-
x :=องค์ประกอบแรกที่มีอยู่
-
ใส่ x ลงใน s
-
ลบองค์ประกอบออกจากที่พร้อมใช้งาน
-
ผลตอบแทน x
-
กำหนดฟังก์ชัน check() ซึ่งจะใช้ตัวเลข
-
ถ้า number>=N หรือตัวเลข <0 แล้ว −
-
คืนค่าเท็จ
-
-
คืนค่าจำนวนจริงไม่อยู่ใน s
-
กำหนดฟังก์ชั่น release() ซึ่งจะใช้ตัวเลข
-
ถ้าตรวจสอบ (หมายเลข) แล้ว −
-
กลับ
-
-
x :=ตัวเลข
-
ลบ x ออกจาก s
-
ใส่ x เข้าไป
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class PhoneDirectory { public: set<int< s; queue<int< available; int N; PhoneDirectory(int maxNumbers){ N = maxNumbers; for (int i = 0; i < N; i++) { available.push(i); } } int get(){ if (available.size() == 0) return -1; int x = available.front(); s.insert(x); available.pop(); return x; } bool check(int number){ if (number >= N || number < 0) return false; return s.find(number) == s.end(); } void release(int number){ if (check(number)) return; int x = number; s.erase(x); available.push(x); } }; main(){ PhoneDirectory ob(3); cout << (ob.get()) << endl; cout << (ob.get()) << endl; cout << (ob.check(2)) << endl; cout << (ob.get()) << endl; cout << (ob.check(2)) << endl; ob.release(2); cout << (ob.check(2)) << endl; }
อินพุต
ob.get(); ob.get(); ob.check(2); ob.get(); ob.check(2); ob.release(2); ob.check(2);
ผลลัพธ์
0 1 1 2 0 1