兩個棧實現一個隊列

這個問題應該是一個很老的問題了吧。遇到過很多次。上次組隊賽上還有個比較類似的題目。竟然沒有其他的隊伍做出來。


其實思想還是比較簡單的。

直接上代碼吧:

#include <iostream>
#include <stack>
using namespace std;

class Queue
{
    private:
        stack<int> s1, s2; //s1爲棧內倒序, s2爲棧內正序
    public:
        int Front(); // 返回隊首元素
        void Push(int _bepush);  // _bepush 放入隊尾
        bool Empty(); // 判ong
        int Size();   // 返回隊列元素個數
        void Pop();   // 刪除隊首元素
};

int Queue::Front()
{
    //如果此時隊內爲空,該如何處理
    if(s1.size() + s2.size() == 0){
        cout << "now the queue is empty" << endl;
        return -1;
    }
    //隊內非空
    int _front = -1;
    if(!s2.empty()){
        _front = s2.top();
    } else {
        while(!s1.empty()){
            s2.push(s1.top());
            s1.pop();
        }
        _front = s2.top();
    }
    return _front;
}

void Queue::Push(int _bepush)
{
    //直接放入棧s1中就ok了
    s1.push(_bepush);
}

bool Queue::Empty()
{
    if(s1.empty() && s2.empty()) return true;
    else return false;
}

int Queue::Size()
{
    //直接返回s1.size + s2.size;
    return s1.size() + s2.size();
}

void Queue::Pop()
{
    if(s1.size() + s2.size() == 0){
        cout << "now the queue is empty" << endl;
        return ;
    }
    if(!s2.empty()){
        s2.pop();
    } else {
        while(!s1.empty()){
            s2.push(s1.top());
            s1.pop();
        }
        s2.pop();
    }
}
int main()
{
    Queue q;
    q.Push(2);
    q.Push(3);
    q.Push(1);

    cout << q.Front() << endl;
    cout << q.Size() << endl;
    return 0;
}


暫時只支持int類型的,不過也是可以直接改成模板類,來進行擴充。


現在可以考慮刷一下Leetcode,和九度oj了。主要還是一些面試題目。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章