Open In App

Which Queue ensures uniqueness of the elements?

A queue is a linear data structure that follows the principle of First In First Out (FIFO). The first element added to the queue will be the first element to be removed from the queue. The queue is a list in which all additions to the list are made at one end, and all deletions from the list are made at the other end. The element which is first pushed into the order, the delete operation is first performed on that.

Which Queue ensures the uniqueness of the elements?

A data structure called a SetQueue includes the attributes of both sets and queues. It keeps a queue of the same components in the order they were introduced to the queue as well as a collection of unique elements



Features of SetQueue:

The SetQueue class has three methods: 




def __init__(self):
  # create a set to maintain the unique elements
  # create a deque to maintain the order of insertion
  self.set = set()
  self.queue = deque()




def enqueue(self, value):
  # check if the value is not in the set
  if value not in self.set:
    # add the value to the set
    self.set.add(value)
    # append the value to the queue
    self.queue.append(value)




def dequeue(self):
  # check if the queue is not empty
  if len(self.queue) > 0:
    # remove and return the first element from the queue
    value = self.queue.popleft()
    # remove the same element from the set
    self.set.remove(value)
    return value

Below is the clear implementation of the above functions:




#include <iostream>
#include <unordered_set>
#include <queue>
 
// SetQueue data structure
template <typename T>
class SetQueue {
private:
    std::unordered_set<T> set;
    std::queue<T> queue;
 
public:
    // Constructor
    SetQueue() {
    }
 
    // Enqueue function
    void enqueue(T value) {
        if (set.find(value) == set.end()) {
            set.insert(value);
            queue.push(value);
        }
    }
 
    // Dequeue function
    T dequeue() {
        if (!queue.empty()) {
            T value = queue.front();
            queue.pop();
            set.erase(value);
            return value;
        }
        return T();
    }
 
    // Get the length of the SetQueue
    int size() const {
        return queue.size();
    }
};
 
// Main function
int main() {
    // Create a new SetQueue
    SetQueue<int> sq;
 
    // Enqueue some elements
    sq.enqueue(1);
    sq.enqueue(2);
    sq.enqueue(3);
    sq.enqueue(2);
 
    // Dequeue some elements
    std::cout << sq.dequeue() << std::endl;
    std::cout << sq.dequeue() << std::endl;
 
    // Enqueue some more elements
    sq.enqueue(4);
    sq.enqueue(3);
 
    // Dequeue the remaining elements
    std::cout << sq.dequeue() << std::endl;
    std::cout << sq.dequeue() << std::endl;
 
    // Check the length of the SetQueue
    std::cout << sq.size() << std::endl;
 
    return 0;
}




import java.util.ArrayDeque;
import java.util.HashSet;
import java.util.Queue;
import java.util.Set;
 
// SetQueue data structure
class SetQueue<T> {
 
    private Set<T> set;
    private Queue<T> queue;
 
    // Constructor
    public SetQueue() {
        this.set = new HashSet<>();
        this.queue = new ArrayDeque<>();
    }
 
    // Enqueue function
    public void enqueue(T value) {
        if (!set.contains(value)) {
            set.add(value);
            queue.offer(value);
        }
    }
 
    // Dequeue function
    public T dequeue() {
        T value = queue.poll();
        if (value != null) {
            set.remove(value);
        }
        return value;
    }
 
    // Get the length of the SetQueue
    public int size() {
        return queue.size();
    }
}
 
// Main class
public class Main {
    public static void main(String[] args) {
 
        // Create a new SetQueue
        SetQueue<Integer> sq = new SetQueue<>();
 
        // Enqueue some elements
        sq.enqueue(1);
        sq.enqueue(2);
        sq.enqueue(3);
        sq.enqueue(2);
 
        // Dequeue some elements
        System.out.println(sq.dequeue());
        System.out.println(sq.dequeue());
 
        // Enqueue some more elements
        sq.enqueue(4);
        sq.enqueue(3);
 
        // Dequeue the remaining elements
        System.out.println(sq.dequeue());
        System.out.println(sq.dequeue());
 
        // Check the length of the SetQueue
        System.out.println(sq.size());
    }
}




# Python Implementation
from collections import deque
 
# SetQueue data  structure
 
 
class SetQueue:
 
    def __init__(self):
        self.set = set()
        self.queue = deque()
 
    # Enque Function
    def enqueue(self, value):
       
        if value not in self.set:
            self.set.add(value)
            self.queue.append(value)
 
    # Deque Function
    def dequeue(self):
       
        if len(self.queue) > 0:
            value = self.queue.popleft()
            self.set.remove(value)
            return value
 
    def __len__(self):
       
        return len(self.queue)
 
 
# Create a new SetQueue
sq = SetQueue()
 
# Enqueue some elements
sq.enqueue(1)
sq.enqueue(2)
sq.enqueue(3)
sq.enqueue(2)
 
# Dequeue some elements
print(sq.dequeue())
print(sq.dequeue())
 
# Enqueue some more elements
sq.enqueue(4)
sq.enqueue(3)
 
# Dequeue the remaining elements
print(sq.dequeue())
print(sq.dequeue())
 
# Check the length of the SetQueue
print(len(sq))




using System;
using System.Collections.Generic;
 
// SetQueue data structure
class SetQueue<T>
{
    private HashSet<T> set = new HashSet<T>();
    private Queue<T> queue = new Queue<T>();
 
    // Constructor
    public SetQueue()
    {
    }
 
    // Enqueue function
    public void Enqueue(T value)
    {
        if (!set.Contains(value))
        {
            set.Add(value);
            queue.Enqueue(value);
        }
    }
 
    // Dequeue function
    public T Dequeue()
    {
        if (queue.Count > 0)
        {
            T value = queue.Dequeue();
            set.Remove(value);
            return value;
        }
        return default(T);
    }
 
    // Get the length of the SetQueue
    public int Size()
    {
        return queue.Count;
    }
}
 
// Main function
class Program
{
    static void Main()
    {
        // Create a new SetQueue
        SetQueue<int> sq = new SetQueue<int>();
 
        // Enqueue some elements
        sq.Enqueue(1);
        sq.Enqueue(2);
        sq.Enqueue(3);
        sq.Enqueue(2);
 
        // Dequeue some elements
        Console.WriteLine(sq.Dequeue());
        Console.WriteLine(sq.Dequeue());
 
        // Enqueue some more elements
        sq.Enqueue(4);
        sq.Enqueue(3);
 
        // Dequeue the remaining elements
        Console.WriteLine(sq.Dequeue());
        Console.WriteLine(sq.Dequeue());
 
        // Check the length of the SetQueue
        Console.WriteLine(sq.Size());
    }
}




class GFG {
  constructor() {
    this.set = new Set();
    this.queue = [];
  }
  // Enqueue function
  enqueue(value) {
    if (!this.set.has(value)) {
      this.set.add(value);
      this.queue.push(value);
    }
  }
  // Dequeue function
  dequeue() {
    if (this.queue.length > 0) {
      const value = this.queue.shift();
      this.set.delete(value);
      return value;
    }
    return null;
  }
  // Get the length of the
  // GFG
  size() {
    return this.queue.length;
  }
}
// Main function
function main() {
  // Create a new GFG
  const sq = new GFG();
  // Enqueue some elements
  sq.enqueue(1);
  sq.enqueue(2);
  sq.enqueue(3);
  sq.enqueue(2);
  // Dequeue some elements
  console.log(sq.dequeue());
  console.log(sq.dequeue());
  // Enqueue some more elements
  sq.enqueue(4);
  sq.enqueue(3);
  // Dequeue the remaining elements
  console.log(sq.dequeue());
  console.log(sq.dequeue());
  // Check the length of
  // the GFG
  console.log(sq.size());
}
// main function
main();

Output

1
2
3
4
0






Time Complexity: O(1)
Auxiliary Space: O(n)

Advantages of SetQueue:

Disadvantages of SetQueue:


Article Tags :