劍指offer(五)用兩個棧實現隊列

題目描述
用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素爲int類型。

思路:

棧是先進後出

要實現的是在隊尾插入節點
在隊首刪除節點

首先呢,可以拿一個例子來看,首先通過一個例子來分析,比如插入一個元素a,可以先將它插入到棧1之中。棧1中目前的元素爲{a},棧2爲空。
再壓入兩個元素b,c。同上。此時棧1的元素爲{a,b,c}。棧2爲空。

現在要刪除啦。想要刪除的元素爲隊首元素。此時需要把a,b,c放在棧2中,然後刪除棧2的棧頂就完成了刪除隊首的操作啦。

此時棧1爲空,棧2爲{c,b},b在棧頂

如果想要再次刪除的話,剩下的爲b,c,需要刪除的爲b。b在棧頂,直接刪除。
此時棧2爲{c},棧1爲空。

總結可知:
刪除一個元素,如果棧2不爲空,直接彈出棧2的棧頂。
棧2爲空的時候,把棧1的元素依次取出放到棧2中,再刪除,即彈出棧頂,如果棧1也爲空,則隊列爲空,無法進行刪除操作

添加一個元素,若棧2爲空,直接添加到棧1之中即可。
如果棧2有元素,則依次取出再放回棧1,再添加元素即可。

class Solution
{
public:
    void push(int node) { 
    //如果棧2不爲空,則取回數字到棧1,再添加元素
        while(!stack2.empty()){
            stack1.push(stack2.top());
            stack2.pop();
        }
         
            stack1.push(node);
        }
    

    int pop() {
        //如果棧1不爲空,則取回數字到棧2,再刪除元素
         while(!stack1.empty())
        {
            stack2.push(stack1.top());
            stack1.pop();
        }
        int t=stack2.top();
        stack2.pop();
        return t;
        }

private:
    stack<int> stack1;
    stack<int> stack2;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章