【100題】第五十七題 用兩個棧實現隊列

來源:互聯網
上載者:User

一,題目

       某隊列的聲明如下:

template<typename T>  class CQueue{public:      CQueue() {}      ~CQueue() {}      void appendTail(const T& node);  // append a element to tail      void deleteHead();               // remove a element from headprivate:     T  m_stack1;     T  m_stack2;};

二,分析

         
棧:後入先出,插入刪除在棧頂操作

          隊列:先入先出,插入在隊尾,刪除在隊首

          因此對隊列進行的插入和刪除操作都是在棧頂上進行;我們總是把新元素插入到隊列的尾部,而從隊列的頭部刪除元素。

          1)stack1  入隊隊列 的棧

          2)stack2  出隊隊列 的棧,如果出隊列時候,stack2為空白則將stack1中元素全部彈入stack2,然後出棧

三,參考代碼如下:

 

template<typename T> void CQueue<T>::appendTail(const T& element)//入隊 {      m_stack1.push(element);}template<typename T> void CQueue<T>::deleteHead() //出隊 {      if(m_stack2.size() <= 0)      {            while(m_stack1.size() > 0)            {                  T& data = m_stack1.top();                  m_stack1.pop();                  m_stack2.push(data);            }      }      assert(m_stack2.size() > 0);      m_stack2.pop();}

擴充:用兩個隊列實現一個棧?

思路:

        1.有兩個隊列q1和q2,先往q1插入入a,b,c,這做的都是棧的push操作。
        2.現在要做pop操作,即要得到c,這時可以將q1中的a,b兩個元素全部dequeue並存入q2中,這時q2中元素為a,b,對q1再做一次dequeue操作即可得到c。
        3.如果繼續做push操作,比如插入d,f,則把d,f插入到q2中,
        4.此時若要做pop操作,則做步驟2
        5.以此類推,就實現了用兩個隊列來實現一個棧的目的。

       注意在此過程中,新push進來的元素總是插入到非空隊列中,空隊列則用來儲存pop操作之後的那些元素,那麼此時空隊列不為空白了,原來的非空隊列變為空白了,總是這樣迴圈。

對於push和pop操作,其時間為O(n).

 

#include <iostream>#include <stack>#include <assert.h>using namespace std;// 兩個隊列實現一個棧template<typename T> class CStack{public:    CStack() {}    ~CStack() {}    void mypush(const T& element);      void mypop();               private:    deque <T> m_queue1;    deque <T> m_queue2;};template<typename T> void CStack<T>::mypop() //出棧 {    if (m_queue1.size() == 0)    {        while (m_queue2.size() > 1)        {            T& data = m_queue2.front();            m_queue2.pop_front();            m_queue1.push_back(data);        }        assert(m_queue2.size() == 1); //確保隊列2內有一個元素        T& result = m_queue2.front();        m_queue2.pop_front();        cout << result << endl;    }    else if (m_queue2.size() == 0)    {        while (m_queue1.size() > 1)        {            T& data = m_queue1.front();            m_queue1.pop_front();            m_queue2.push_back(data);        }        assert(m_queue1.size() == 1); //確保隊列1內有一個元素        T& result = m_queue1.front();        m_queue1.pop_front();        cout << result << endl;    }}template<typename T> void CStack<T>::mypush(const T& element)//入棧 {    if (m_queue1.size() > 0)    {        m_queue1.push_back(element);    }    else if (m_queue2.size() > 0)    {        m_queue2.push_back(element);    }    else    {        m_queue1.push_back(element);    }}int main(){    CStack<int> myStack;    myStack.mypush(1);    myStack.mypush(2);    myStack.mypush(3);    myStack.mypop();    myStack.mypush(4);    myStack.mypop();    return 0;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.