3.5 Implement a MyQueue class which implements a queue using two stacks.

/*
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;
}

Leave a comment