剣指offer第五題:2つのスタックでキューを実現する(c++実現)


2つのスタックで1つのキューを実現し、キューのPushとPop操作を完了します.キュー内の要素はintタイプです.考え方:スタックに入る時に要素をstack 1に入れ、同時にstack 2が空であるかどうかを判断し、空であればstack 1中の要素を順番にstack 2にスタックする.スタックを出るとき1)まずstack 2が空であるか否かを判断し、空であればstack 1が空であるか否かを判断し、stack 1が空でなければその要素をすべてstack 2にスタックする.2)stack 2のスタックトップ要素を取得する、stack 2に対してスタックアウト動作を実行する.
#include  
#include  
#include 
#include   
using namespace std; 

class myList
{
private:
   stack stack1;// 
   stack stack2;// 
public:
    myList(/* args */);
    ~myList();
    //   
    void push(int node) {
        stack1.push(node);// stack1
        if(stack2.empty())//       stack1     stack2 
        {
            while(!stack1.empty())// stack1       stack2 
            {
                stack2.push(stack1.top());
                stack1.pop();
            }
        }        
    }
    int pop() {//   
        if(stack2.empty())//stack  
        {
            while (!stack1.empty())//stack1           stack2
            {
                stack2.push(stack1.top());
                stack1.pop();
            }
        }
        int result=stack2.top();//  stack2    
        stack2.pop(); //stack2  
        return result;       
    }
    //        
    int top(){
        if(stack2.empty())//stack2  
        {
            if(!stack1.empty())//stack1  ,        stack2
            {
                while (!stack1.empty())
                {
                    stack2.push(stack1.top());
                    stack1.pop();
                }
            }
            else//stack1 ,      
            {
                return -1;
            }                    
        }
        return stack2.top();//  stack2    
    }
    //        
    bool isEmpty(){
        if(stack1.empty()&&stack2.empty())//stack1 stack2     
        {
            return true;
        }
        else//    
        {
            return false;
        }
        
    }
    //      
    int size(){
        return stack1.size()+stack2.size();
    }
};

myList::myList(/* args */)
{
}

myList::~myList()
{
}
//       
void printPop(myList* lst)
{
    int tmp=lst->pop();
    if(tmp==-1)
        cout<top();
    if(tmp==-1)
        cout<push(i*2);
    }

    printTop(tstLst);

    printPop(tstLst);
        
    printTop(tstLst);

    tstLst->push(9);
    printPop(tstLst);
    printPop(tstLst);
    printPop(tstLst);
    printPop(tstLst);
    printPop(tstLst);
    
    printTop(tstLst);

    tstLst->push(3);
    tstLst->push(4);
    printTop(tstLst);
    printPop(tstLst);
    printTop(tstLst);

    for(int i=0;i<5;i++)
    {
        tstLst->push(i*3);
    }
    
    printPop(tstLst);
    
    return 0; 
}

具体的な考え方は以下の文章を参考にすることができる.
剣指Offer面接問題:6.2つのスタックでキューを実装
『剣指offer』--2つのスタックでキューを実現