สมมติว่าเราต้องการออกแบบ 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