/* * stack-01.cc Standard Library, std::stack, exercise 1. */ #include #include #include using namespace std; template> class Queue { public: using value_type = typename Container::value_type; using size_type = typename Container::size_type; using container_type = Container; explicit Queue(const Container& contents = Container()); bool empty() const; size_type size() const; value_type& front(); const value_type& front() const; value_type& back(); const value_type& back() const; void push(const value_type& x); void pop(); private: std::stack instack_; std::stack outstack_; void transfer(); void untransfer(); }; template Queue::Queue(const Container& contents) : outstack_{ contents } {} template bool Queue::empty() const { return instack_.empty() && outstack_.empty(); } template typename Queue::size_type Queue::size() const { return instack_.size() + outstack_.size(); } template typename Queue::value_type& Queue::front() { transfer(); return outstack_.top(); } template const typename Queue::value_type& Queue::front() const { transfer(); return outstack_.top(); } template typename Queue::value_type& Queue::back() { untransfer(); return instack_.top(); } template const typename Queue::value_type& Queue::back() const { untransfer(); return instack_.top(); } template void Queue::push(const value_type& x) { instack_.push(x); } template void Queue::pop() { transfer(); outstack_.pop(); } template void Queue::transfer() { if (outstack_.empty()) while (! instack_.empty()) { outstack_.push(instack_.top()); instack_.pop(); } } template void Queue::untransfer() { if (instack_.empty()) while (! outstack_.empty()) { instack_.push(outstack_.top()); outstack_.pop(); } } int main() { Queue q; for (int i = 0; i < 10; ++i) { q.push(i); cout << i << " pushed\n"; } cout << '\n'; cout << "queue size is " << q.size() << '\n'; cout << "queue front is " << q.front() << '\n'; cout << "queue back is " << q.back() << '\n'; cout << '\n'; while (! q.empty()) { cout << q.front() << " popped\n"; q.pop(); } cout << '\n'; cout << "queue size is " << q.size() << '\n'; return 0; }