題目描述
用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。
棧和隊列
解題前我們先來了解下什么是棧和隊列
棧是限制插入和刪除只能在一個位置上進行的表,是后進先出表,比如,在棧中依次插入1,2,3,4(由棧頂插入),如下圖所示。由於棧是限制只能在一個位置上進行操作,所以刪除(彈出)也只能在棧頂進行,即彈出順序為4,3,2,1。正好是最后插入4的最先彈出,最先插入的1最后彈出。

隊列是插入在一端進行而刪除在另一端進行的表,是先進先出表,比如依次在隊列中插入1,2,3,4(這里是從隊尾插入)。如下圖所示。由於刪除只能在另一端即隊頭(隊首)進行,所以出隊順序為1,2,3,4。可以看到最先入隊的1是最先出隊,最后入隊的4也是最后出隊。

解法
題目要求是用兩個棧來模擬一個隊列。棧的特性是后進先出,隊列的特性是先進先出,可以發現他們的順序剛好是相反的。那么自然就想到相反的相反的就是對的順序了。舉個例子,仍然是往棧A中依次插入1,2,3,4,此時它的彈出順序是4,3,2,1。若再將這個彈出順序4,3,2,1,依次插入到棧B中,此時棧B的彈出順序就是1,2,3,4,對於最開始插入的1,2,3,4序列剛好滿足了先進先出的特性。
實現代碼
using System.Collections.Generic;
class Solution
{
Stack<int> pushStack = new Stack<int>();
Stack<int> popStack = new Stack<int>();
// 入隊
public void push(int node)
{
pushStack.Push(node);
}
// 出隊
public int pop()
{
if (popStack.Count <= 0)
{
while(pushStack.Count > 0)
{
// 在出隊時,先將pushStack中元素依次彈出並插入到popStack中
popStack.Push(pushStack.Pop());
}
}
// 再通過popStack彈出
return popStack.Pop();
}
}
更多題目的完整描述,AC代碼,以及解題思路請參考這里https://github.com/iwiniwin/Algorithm
