在做這道題之前,我們首先要搞清楚佇列和棧的特點。
佇列:先進先出,即插入資料在隊尾進行,刪除資料在隊頭進行;
棧:後進先出,即插入與刪除資料均在棧頂進行。
pop:
如果我們要實現乙個棧,我們先進入的資料一定是先出去的,怎麼樣利用佇列實現這個特點呢?我們可以利用兩個佇列來進行資料順序的調整。當我們需要刪除資料時,我們可以先將資料push到乙個佇列當中,pop時,因為佇列是先進先出的,所以我們可以將隊尾的元素保留下來,其餘元素按照出隊的順序入隊到另外乙個佇列當中,然後pop第乙個佇列的最後乙個元素,這樣就實現了棧的刪除操作。
上圖是棧進行一次刪除資料的示意圖,當我們需要再次刪除資料時,我們需要將queue2的隊尾資料儲存下來進行pop,其餘資料入隊到另外乙個佇列當中。就這樣利用兩個佇列來對資料進行來回交換實現棧。
寫**的時候需要注意當兩個佇列都為空的時候是沒有辦法pop資料的。
push:
當我們要插入資料的時候,我們需要對佇列進行判斷,將資料插入到非空的佇列當中。這樣的話pop時我們分情況討論的時候只用分隊列為空和不為空兩種情況,有利於**的編寫。若是插入資料時將資料插入到非空佇列,那就可能出現第三種情況,兩個佇列都不為空,這個時候寫的**就比較複雜了。所以選擇第一種方式。
#include#includeusing namespace std;
templateclass satck
~satck()
{}void push(const t& data)
else if (queue2.size() > 0)//q2非空
else//q1,q2都為空
}void pop()
queue1.pop();
}else
queue2.pop();}}
t& top()
else
}bool empty()
else
return false ;
}size_t size()
else if (queue1.size() > 0)
else
}private:
queuequeue1;
queuequeue2;
};void funtest()
int main()
面試題8 用兩個棧實現乙個佇列
templateclass cqueue 解答 這題仔細分析下,應該可以做出來。有兩個棧stack1和stack2。那麼,如果stack2為空,我們將stack1 出佇列逆序 的數壓入到stack2 出佇列順序 在對stack2進行出棧。如果stack2非空,直接出棧。實現如下 include in...
面試題07 用兩個棧實現乙個佇列
題目描述 用兩個棧實現乙個佇列。分別完成在佇列尾部插入結點和在佇列頭部刪除結點的功能。基本知識 1 佇列的操作 offer 隊尾插入元素,插入失敗返回false。poll 隊頭取出元素 linkedlist類實現了queue介面,因此我們可以把linkedlist當成queue來用。2 實現棧的操作...
面試題 4 用兩個棧實現佇列 用兩個佇列實現棧
首先,我們知道 棧 是先進後出的,佇列 是先進先出的。我們先在 stack1 中插入 a b c d 四個字母。此時,我們如果要做出隊操作的話,a 應該首先被 pop 出來,那麼我們想到,把 stack1 中的所有數 先 pop 出來,那麼 a 就可以出隊了。這時,我們可以利用 stack2 我們將...