面試題-----兩個棧實現一個隊列

一、用兩個棧模擬一個隊列

思路:看到這個問題,首先我們應該想到的是:棧和隊列各自都有什麼特性。那讓我們回憶一下:棧先進後出,即先入棧的後出棧,而隊列是先進先出,即先入隊列的先出隊列。那麼現在我們的目標就很明確了,用棧實現隊列,即就是要用先進後出模擬出先進先出。

那麼如何用棧來實現隊列吶?

假設1,2,3,4,5按照順序入棧,那麼出棧的序列理應爲5,4,3,2,1,出隊的序列則應該爲1,2,3,4,5,這時就需要藉助另外一個棧,如下圖:


首先棧1不空,棧2是空的,那麼按照出棧的規則先將棧1中的元素出棧(5,4,3,2,1),再全部入棧到棧2中(1,2,3,4,5),此時棧頂元素就爲1,然後出棧2(1,2,3,4,5),即實現了隊列的出隊。這樣看來,棧1是作爲入隊的棧,而棧2是作爲出隊的棧。具體如下圖:


看圖我們就能很快寫出代碼來了,但是這個時候應該想一想我們的方案還有哪些不周全的地方,有哪些情況我們並沒有考慮上。仔細觀察,不難發現,似乎沒有考慮當出隊列時棧2爲空的情形,實際上經過上面的思考,應該很容易發現,當想要出隊列時,首先應該去看看棧2空不空,空的話就是上述方案,不空的話證明還有元素等待出隊,那麼直接將棧2元素出棧即可。參考代碼如下:

class MyQueue
{
public:
    void push(int value) 
	{
        stack1.push(value);
    }

    int pop() 
	{
        int value = 0;
        if(stack2.size() <= 0)
        {
        	while(stack1.size() > 0)
            {
            	int tmp = stack1.top();
                stack1.pop();
                stack2.push(tmp);
               
            }
        }    
       if(stack2.size() == 0)
       {
			throw std::exception("empty queue"); 
       }
        
        value = stack2.top();
        stack2.pop();
        
        return value;
        
    }

private:
    stack<int> stack1; //入隊的棧
    stack<int> stack2; //出隊的棧
};

總結:遇到此類問題,依然要注意邏輯上的思考,思維應該縝密。


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