2014-12-06 11:16:03 +13:00
|
|
|
#include <iostream>
|
2014-12-06 12:17:53 +13:00
|
|
|
#include <stdexcept>
|
2014-12-06 11:16:03 +13:00
|
|
|
|
2014-12-06 11:39:48 +13:00
|
|
|
namespace ads {
|
2014-12-06 11:16:03 +13:00
|
|
|
|
2014-12-06 11:39:48 +13:00
|
|
|
template<typename T>
|
|
|
|
|
class Queue
|
|
|
|
|
{
|
|
|
|
|
struct Node
|
|
|
|
|
{
|
|
|
|
|
T data_;
|
2014-12-06 12:17:53 +13:00
|
|
|
Node* next_;
|
2014-12-06 11:39:48 +13:00
|
|
|
};
|
2014-12-06 12:17:53 +13:00
|
|
|
|
2014-12-06 11:39:48 +13:00
|
|
|
public:
|
|
|
|
|
using SizeType = std::size_t;
|
|
|
|
|
|
2014-12-06 12:17:53 +13:00
|
|
|
void join(T t)
|
2014-12-06 11:39:48 +13:00
|
|
|
{
|
2014-12-06 12:17:53 +13:00
|
|
|
do_join(std::move(t));
|
2014-12-06 11:39:48 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void leave()
|
|
|
|
|
{
|
2014-12-06 12:17:53 +13:00
|
|
|
do_leave();
|
2014-12-06 11:39:48 +13:00
|
|
|
}
|
|
|
|
|
|
2014-12-06 12:17:53 +13:00
|
|
|
T const& front() const
|
2014-12-06 11:39:48 +13:00
|
|
|
{
|
2014-12-06 12:17:53 +13:00
|
|
|
return head_->data_;
|
2014-12-06 11:39:48 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SizeType size()const
|
|
|
|
|
{
|
|
|
|
|
return size_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool empty()const
|
|
|
|
|
{
|
2014-12-06 12:17:53 +13:00
|
|
|
return head_ or tail_;
|
2014-12-06 11:39:48 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
Node* head_{nullptr};
|
|
|
|
|
Node* tail_{nullptr};
|
|
|
|
|
SizeType size_{0};
|
2014-12-06 12:17:53 +13:00
|
|
|
|
|
|
|
|
void do_join(T && t) noexcept
|
|
|
|
|
{
|
|
|
|
|
if(empty())
|
|
|
|
|
head_ = tail_ = new Node{std::move(t), nullptr};
|
|
|
|
|
else
|
|
|
|
|
tail_ = tail_->next_ = new Node{std::move(t), nullptr};
|
|
|
|
|
++size_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void do_leave()
|
|
|
|
|
{
|
|
|
|
|
if(size_ == 0)
|
|
|
|
|
throw std::runtime_error{"underflow!"};
|
|
|
|
|
|
|
|
|
|
if(size_ == 1)
|
|
|
|
|
{
|
|
|
|
|
delete head_;
|
|
|
|
|
head_ = tail_ = nullptr;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
auto tmp = head_;
|
|
|
|
|
head_ = head_->next_;
|
|
|
|
|
delete tmp;
|
|
|
|
|
}
|
|
|
|
|
--size_;
|
|
|
|
|
}
|
2014-12-06 11:39:48 +13:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}//namespace
|
2014-12-06 11:16:03 +13:00
|
|
|
|
|
|
|
|
int main()
|
|
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|