пятница, 7 июня 2013 г.

Random Queue (имитация неупорядоченной очереди)

Из данной очереди элементы удаляются в случайном порядке.


#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

template<typename T>
class RandomQueue
{
public:
RandomQueue(int size);
~RandomQueue();

void put(T item);
T get();
bool empty();
private:
T *m_random;
T m_head;
T m_tail;
T m_tmp;
};

template<typename T>
RandomQueue<T>::RandomQueue(int size)
{
m_tmp = size + 1;
m_head = m_tmp;
m_tail = 0;
m_random = new T[size + 1];
}

template<typename T>
RandomQueue<T>::~RandomQueue()
{
delete[] m_random;
}

template<typename T>
void RandomQueue<T>::put(T item)
{
if (m_tail < m_tmp - 1)
{
m_random[m_tail++] = item;
}
else
{
cout << "Queue is fill" << endl;
}
}

template<typename T>
T RandomQueue<T>::get()
{
if(m_tail > 0)
{
T outputItem;
srand(time(0));
m_head = rand()%m_tail;

outputItem = m_random[m_head];
for (int i = m_head; i < m_tail; ++i) //Смещаем все элементы на один влево
{                                                   //Заполняя получившийся пробел
m_random[i] = m_random[i + 1];
}
--m_tail;   //Номер хвоста

return outputItem;
}
}

template<typename T>
bool RandomQueue<T>::empty()
{
return (m_tail == 0);
}