C++電話簿設計
假設我們想設計一個支援以下操作的電話簿:
get - 獲取一個未分配的號碼。
check - 檢查一個號碼是否可用。
release - 回收或釋放一個號碼。
可以使用初始化器一開始初始化n個號碼。
為了解決這個問題,我們將遵循以下步驟:
定義一個集合s
定義一個佇列available
初始化器將接收maxNumbers。
N := maxNumbers
for 初始化 i := 0, 當 i < N, 更新 (i 加 1), 執行:
將i插入available
定義函式get()
如果available的大小為0,則:
返回 -1
x := available的第一個元素
將x插入s
從available中刪除該元素
返回x
定義函式check(),它將接收number,
如果number >= N 或 number < 0,則:
返回false
返回true (如果number不在s中)
定義函式release(),它將接收number,
如果check(number)為真,則:
返回
x := number
從s中刪除x
將x插入available
示例
讓我們看下面的實現來更好地理解:
#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
廣告