/* Logic1: LAZY Dump */ #include <stack> #include <iostream> #include <cassert> using namespace std; template <class T> class MyQueue { private: /* BIG BUG: typedef stack<T>*, StkPtr; COMMA IS NOT NEEDED */ typedef stack<T>* StkPtr; StkPtr front, rear; void _dump(StkPtr des, StkPtr src) { while (! src->empty()) { des->push(src->top()); src->pop(); } }; public: MyQueue() { front = new stack<T>; rear = new stack<T>; }; ~MyQueue() { delete rear; rear = NULL; delete front; front = NULL; }; T pop_front() { assert((!front->empty()) || (!rear->empty())); if (rear->empty()) { _dump(rear, front); } T rval = rear->top(); rear->pop(); return rval; }; void push_back(T ele) { if (front->empty()) { _dump(front, rear); } front->push(ele); }; }; int main() { MyQueue<int> mq; mq.push_back(1); mq.push_back(3); cout << mq.pop_front() << endl; cout << mq.pop_front() << endl; mq.push_back(4); cout << mq.pop_front() << endl; mq.push_back(5); cout << mq.pop_front() << endl; return 0; }