一,題目
某隊列的聲明如下:
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;}