一、用兩個棧模擬一個隊列
思路:看到這個問題,首先我們應該想到的是:棧和隊列各自都有什麼特性。那讓我們回憶一下:棧先進後出,即先入棧的後出棧,而隊列是先進先出,即先入隊列的先出隊列。那麼現在我們的目標就很明確了,用棧實現隊列,即就是要用先進後出模擬出先進先出。
那麼如何用棧來實現隊列吶?
假設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; //出隊的棧
};
總結:遇到此類問題,依然要注意邏輯上的思考,思維應該縝密。