栈是先进后出,队列是先进先出
一、两个栈实现队列
只要考虑一个栈作为输入,另一个栈作为输出即可
template <typename T> class CQueue { public: CQueue(void){}; ~CQueue(void){}; void appendTail(const T&); T deleteHead(); private: stack<T> stack1; stack<T> stack2; } ; template <typename T> void CQueue<T>::appendTail(const T& node) { stack1.push(node); } template <typename T> T CQueue<T>::deleteHead() { if(stack2.empty()&&stack1.empty()) return -1; T res; if(stack2.empty()) { while(stack1.size()>1) { stack2.push(stack1.top()); stack1.pop(); } res=stack1.top(); stack1.pop(); } else { res=stack2.top(); stack2.pop(); } return res; }
二、两个队列实现栈
两个队列无论怎么转换先进先出的顺序是不会改变的,所以队顶的数永远是最后输出,因而每次输入直接加到有值队列即可,输出时获取有值队列最后一个值,并将之前的转换到另一个队列。
template <typename T> class Cstack { public: Cstack(void){} ~Cstack(void){} void Cpush(const T&); void Cpop(); T Ctop(); private: queue<T> queue1; queue<T> queue2; }; template <typename T> void Cstack<T>::Cpush(const T& data) { if(!queue2.empty()) queue2.push(data); else queue1.push(data); } template <typename T> void Cstack<T>::Cpop() { if(queue1.empty()&&queue2.empty()) return; if(!queue1.empty()) { while(queue1.size()>1) { queue2.push(queue1.front()); queue1.pop(); } queue1.pop(); } else if(!queue2.empty()) { while(queue2.size()>1) { queue1.push(queue2.front()); queue2.pop(); } queue2.pop(); } } template <typename T> T Cstack<T>::Ctop() { if(queue1.empty()&&queue2.empty()) return -1; T res; if(!queue1.empty()) { while(queue1.size()>1) { queue2.push(queue1.front()); queue1.pop(); } res=queue1.front(); queue2.push(queue1.front()); queue1.pop(); } else if(!queue2.empty()) { while(queue2.size()>1) { queue1.push(queue2.front()); queue2.pop(); } res=queue2.front(); queue1.push(queue2.front()); queue2.pop(); } return res; }