用队列实现栈


问题:能否用队列实现栈?

问题分析:本质为,用队列先进先出的特性实现栈后进先出的特性。

 

 

 

 QueueToStack.h

#include <iostream> #include "linkstack.h" #include "LinkQueue.h"

using namespace std; using namespace DTLib; template <typename T>
class QueueToStack : public Stack<T> { protected: LinkQueue<T> m_queue_1; LinkQueue<T> m_queue_2; LinkQueue<T>* m_pIn; LinkQueue<T>* m_pOut; void move() const   //O(n)
 { int n = m_pIn->length() - 1; for(int i=0; i<n; i++) { m_pOut->add(m_pIn->front()); m_pIn->remove(); } } void swap() { LinkQueue<T>* temp = NULL; temp = m_pIn; m_pIn = m_pOut; m_pOut = temp; } public: QueueToStack() { m_pIn = &m_queue_1; m_pOut = &m_queue_2; } void push(const T& e)  //O(1)
 { m_pIn->add(e); } void pop()   //O(n)
 { if(m_pIn->length() > 0) { move(); //转移数据元素
            m_pIn->remove(); swap(); } else { THROW_EXCEPTION(InvalidOperationException,"No element in the current queue..."); } } T top() const   //O(n)
 { if(m_pIn->length() > 0) { move(); //将队列中的n-1个元素进行转移
            return m_pIn->front(); //因为已经将n-1个数据元素进行了转移,因此队列中还剩一个数据元素,即队头元素,也是最后入队列的元素。
 } else { THROW_EXCEPTION(InvalidOperationException,"No element in the current queue..."); } } void clear()   //O(n)
 { m_queue_1.clear(); m_queue_2.clear(); } int size() const   //O(1)
 { return m_queue_1.length() + m_queue_2.length(); } }; int main() { QueueToStack<int> qts; for(int i =0; i<10; i++) { qts.push(i); } while(qts.size() > 0) { cout << qts.top() << endl; qts.pop(); } return 0; }

 

 通过上面的打印结果,可以看出可以用队列实现栈的后进先出的特性。

栈的关键操作,时间复杂度非常差。通过这个例子仅仅是为了加强对栈和队列的理解,后进先出和先进先出是可以相互转换的。

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM