#include <iostream>
using namespace std;
template <class T>
class LinearQueue {
public:
LinearQueue(int LQMaxSize);
~LinearQueue();
bool IsEmpty();
bool IsFull();
bool Insert(const T& x);
bool GetElement(T& x);
bool Delete(T& x);
void OutPut(ostream& out) const;
private:
int MaxSize;
int front, rear;
int size;
T* elem;
};
template <class T>
LinearQueue<T>::LinearQueue(int LQMaxSize) {
MaxSize = LQMaxSize;
elem = new T[LQMaxSize];
size = 0;
front = 0;
rear = 0;
}
template<class T>
LinearQueue<T>::~LinearQueue()
{
delete []elem;
}
template<class T>
bool LinearQueue<T>::IsEmpty()
{
return size==0;
}
template<class T>
bool LinearQueue<T>::IsFull()
{
return size == MaxSize;
}
template<class T>
bool LinearQueue<T>::Insert(const T& x)
{
if (IsFull())
return false;
else {
elem[rear] = x;
rear = (rear + 1) % (MaxSize);
size++;
return true;
}
}
template<class T>
bool LinearQueue<T>::GetElement(T& x)
{
if (IsEmpty())
return false;
else {
x = elem[front];
return true;
}
}
template<class T>
bool LinearQueue<T>::Delete(T& x)
{
if (IsEmpty())
return false;
else {
x=elem[front];
front = (front + 1) % (MaxSize);
size--;
return true;
}
}
template<class T>
void LinearQueue<T>::OutPut(ostream& out) const
{
int index;
index = front;
for (int i = 0; i < size; i++) {
out << elem[index] << endl;
index = (index + 1) % (MaxSize);
}
}
template <class T>
ostream& operator<<(ostream& out, const LinearQueue<T>& x) {
x.OutPut(out);
return out;
}
int main() {
LinearQueue<int> q(10);
q.Insert(100);
q.Insert(200);
cout << q;
return 0;
}