Design Phone Directory in C++


Suppose we want to design a Phone Directory which supports the following operations −

  • get − This will provide a number that is not assigned to anyone.

  • check − This will check whether a number is available or not.

  • release − This will recycle or release a number.

Using the initializer, we can initialize n numbers at first

To solve this, we will follow these steps −

  • Define one set s

  • Define one queue available

  • The initializer will take maxNumbers.

  • N := maxNumbers

  • for initialize i := 0, when i < N, update (increase i by 1), do −

    • insert i into available

  • Define a function get()

  • if size of available is same as 0, then −

    • return -1

  • x := first element of available

  • insert x into s

  • delete element from available

  • return x

  • Define a function check(), this will take number,

  • if number >= N or number < 0, then −

    • return false

  • return true number is not in s

  • Define a function release(), this will take number,

  • if check(number), then −

    • return

  • x := number

  • delete x from s

  • insert x into available

Example 

Let us see the following implementation to get a better understanding −

 Live Demo

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

Input

ob.get();
ob.get();
ob.check(2);
ob.get();
ob.check(2);
ob.release(2);
ob.check(2);

Output

0
1
1
2
0
1

Updated on: 19-Nov-2020

390 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements