兩個隊列實現一個棧

使用兩個隊列來模擬實現一個棧的功能

因爲隊列的特性是先入先出,棧的特性是後入先出,所以相當於是把一開始入到隊列裏面的數據先出出去,直到剩下最後一個數據,也就是本來棧中應該彈出的最後一個進入的數據,所以兩個隊列,就來回倒,就好了,每次都出隊列中最後一個數據就好;

劍指offer

因爲queue中有一個接口是back,即隊列的尾數據,剛好相當於隊棧top的數據,所以比較與兩個棧實現一個隊列中模擬front會簡單一些;


#include <iostream>
#include <queue>
#include <assert.h>
using namespace std;

template <class T>
class QStack
{
public:
    void Push(const T& x)
    {
        if ((q1.size() == 0) && (q2.size() == 0))//兩個隊列都爲空
        {
            q1.push(x);
        }
        else if (q1.size() == 0)//否則跟在不爲空的隊列
        {
            q2.push(x);
        }
        else
        {
            q1.push(x);
        }
    }
    void Pop()
    {
        if ((q1.size() == 0) && (q2.size() == 0))
        {
            cout << "數據爲空"<<endl;
            return;
        }
        else if (q1.size() == 0)
        {
            Move(q2, q1);
        }
        else
        {
            Move(q1, q2);
        }
    }

    T& Top() 
    {
        if ((q1.size() == 0) && (q2.size() == 0))
        {
            assert(-1);
        }
        else if (q1.size() == 0)
        {
            return q2.back();
        }
        else
        {
            return q1.back();
        }
    }
    size_t Size()
    {
        return q1.size() + q2.size();
    }
    size_t Empty()
    {
        return q1.empty() && q2.empty();
    }
protected:
    void Move(queue<T>& q,queue<T>& nq)//null_queue
    {
        assert(q.size());
        int size = q.size();
        int tmp = 0;
        while (size > 1)
        {
            tmp = q.front();
            q.pop();
            nq.push(tmp);

            size--;
        }
        q.pop();
    }
protected:
    queue<T> q1;
    queue<T> q2;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章