#ifndef _QUEUE_H
#define _QUEUE_H

#include "graph.h"
#include "stack.h"
#include <stddef.h>
#include <stdlib.h>

typedef struct {
    stack* in;
    stack* out;
    size_t size;
} queue;

queue* new_queue(void);
void free_queue(queue* Q);
int is_empty_queue(queue* Q);
void enqueue(queue* Q, size_t elem);
int dequeue(queue* Q, size_t* elem);
void empty_queue(queue* Q);

// NOTE: these are O(n) operations as they needs to loop through all elements
// of the queue
void remove_from_queue(queue* Q, size_t elem);
void bulk_remove_from_queue(queue* Q, const size_t* ToRemove);
int contains_queue(queue* Q, size_t elem);

#endif
