#include <iostream>
template <typename T>
class Queue
{
protected:
struct Node
{
T data;
Node *prev; // has been enqueued
Node *next; // will be enqueued
};
typedef Node* NodePtr;
private:
NodePtr front_;
NodePtr back_;
int size_ = -1;
public:
Queue();
virtual ~Queue();
void enqueue(const T&);
void dequeue();
T& front();
T& back();
const T front() const;
const T back() const;
int isSize() const;
bool isEmpty() const;
public:
friend std::ostream& operator << (std::ostream& os, const Queue& q)
{
NodePtr node = q.front_;
while (node != NULL) {
os << node->data << " ";
node = node->next;
}
return os;
}
};
template <typename T>
Queue<T>::Queue()
: front_(NULL), back_(NULL), size_(0)
{}
template <typename T>
Queue<T>::~Queue()
{
while (size_ > 0) {
dequeue();
}
}
template <typename T>
void Queue<T>::enqueue(const T& data)
{
NodePtr new_node = new Node;
new_node->data = data;
new_node->prev = back_;
new_node->next = NULL;
if (isEmpty() == true) {
front_ = new_node;
}
else {
back_->next = new_node;
}
back_ = new_node;
size_++;
}
template <typename T>
void Queue<T>::dequeue()
{
NodePtr node = front_;
front_ = front_->next;
if (front_ == NULL) {
back_ = NULL;
}
else {
front_->prev = NULL;
}
size_--;
delete node;
}
template <typename T>
T& Queue<T>::front()
{
return front_->data;
}
template <typename T>
const T Queue<T>::front() const
{
return front_->data;
}
template <typename T>
T& Queue<T>::back()
{
return back_->data;
}
template <typename T>
const T Queue<T>::back() const
{
return back_->data;
}
template <typename T>
int Queue<T>::isSize() const
{
return size_;
}
template <typename T>
bool Queue<T>::isEmpty() const
{
return (size_ == 0);
}
void main()
{
Queue<int> q;
int a;
std::cout << "--- start ---" << std::endl;
q.enqueue(1);
std::cout << q << std::endl;
q.enqueue(2);
std::cout << q << std::endl;
q.enqueue(3);
std::cout << q << std::endl;
q.dequeue();
q.dequeue();
std::cout << q << std::endl;
std::cout << q.front() << std::endl;
q.enqueue(100);
std::cout << q.back() << std::endl;
std::cout << (a = q.front()) << std::endl;
std::cout << "--- end ---" << std::endl;
}
'Programming > C,C++' 카테고리의 다른 글
C, const vs 가변인자 [펌] (0) | 2017.04.07 |
---|---|
Stack (Double Linked), C++ (0) | 2017.04.07 |
new delete + Heap overruns checker (0) | 2017.04.05 |
c++ new delete overriding / leak checker (0) | 2017.04.03 |
상속과 virtual함수 [펌] (0) | 2017.03.27 |