#include using namespace std; template struct elem{ T inf; elem * neighbours[2]; }; template class Deque { public: Deque(); Deque(const Deque &); ~Deque(); Deque& operator=(const Deque&); void pushBack(const T & value); void pushFront(const T & value); void popBack(); void popFront(); T back() const; T front() const; bool isEmpty() const; // friend ostream& operator<<(ostream&, const Deque&); // friend istream& operator>>(istream&, Deque&); private: void pop(int); void push(const T &, int); T element(int) const; elem * link[2]; }; template Deque::Deque() { link[0]= NULL; link[1] = NULL; } template Deque::~Deque() { while(!isEmpty()) popFront(); } template bool Deque::isEmpty() const { return (link[0] == NULL); } template void Deque::popFront() { pop(0); } template void Deque::popBack() { pop(1); } template void Deque::pop(int a) { if ( !isEmpty() && link[a] != link[!a] ) { elem * c = link[a]; link[a] = link[a]->neighbours[!a]; delete c; } else { delete link[a]; link[a] = link[!a] = NULL; } } template void Deque::pushFront(const T & val) { push(val, 1); } template void Deque::pushBack(const T & val) { push(val, 1); } template void Deque::push(const T & val, int a) { elem * n = new elem(); n->inf = val; n->neighbours[a] = NULL; if ( isEmpty() ) { n->neighbours[!a] = NULL; link[!a] = link[a] = n; } else { n->neighbours[!a] = link[a]; link[a]->neighbours[a] = n; link[a] = n; } } template T Deque::front() const { return element(1); } template T Deque::back() const { return element(0); } template T Deque::element(int a) const { return link[!a] -> inf; } int main() { Deque d; int all = 50; for ( int i = 0 ; i < all ; ++i) { d.pushBack(i); } for ( int i = 0; i < 25; ++i ) { cout << d.front() << " "; d.popFront(); } while (!d.isEmpty()) { cout << d.back() << " "; d.popBack(); } return 0; }