题目:某队列的声明如下:
template<typename T, int MAXSIZE> class Stack; template<typename T> class CQueue{ public: CQueue(){} ~CQueue(){} void appendTail(const T& node); void deleteHead(); void pop(T& node); private: Stack<T, 1024> m_stack1; Stack<T, 1024> m_stack2; };
分析:
从上面队列的声明,可以看出队列CQueue实现是使用两个栈m_stack1和m_stack2,
一个栈用于插入数据:
m_stack1.push(data)
如插入数据:1,2,3,4,5,6
一个栈用于取数据:
这时可以把m_stack1里面的内容放入到m_stack2中,这样插入m_stack2的顺序为:
6,5,4,3,2,1
这样 m_stack2.pop() 是不是就是 1,2,3,4,5了。
看看直观的图如下:
实现如下:
#include<stdio.h> #include<string.h> #include<iostream> #include<stdlib.h> using namespace std; template<typename T, int MAXSIZE> class Stack; template<typename T> class CQueue{ public: CQueue(){} ~CQueue(){} void appendTail(const T& node); void deleteHead(); void pop(T& node); private: Stack<T, 1024> m_stack1; Stack<T, 1024> m_stack2; }; template<typename T, int MAXSIZE=1024> class Stack{ private: T data[MAXSIZE]; int pos; public: Stack():pos(0){} bool empty() { return pos == 0; } bool full() { return pos == MAXSIZE; } bool get(T& _value) { if(empty()) return false; _value = data[pos-1]; return true; } bool pop(T& _value) { { if(empty()) return false; _value = data[--pos]; return true; } bool push(const T& _value) { if(full()) return false; data[pos] = _value; pos ++; return true; } }; template <typename T> void CQueue<T>::appendTail(const T& node) { //if(!m_stack1.full()) m_stack1.push(node);//这有个问题:这个队列顶多只有1024个空间,实际队列可存储的空间最多为2048,没能很好的利用空间<span style="white-space:pre"> if(m_stack1.full()) //如果m_stack1满了,判断下m_stack2是否为空,如果为空,则把m_stack1的内容插入到 m_stack2中,> 否则插入失败。 { if(!m_stack2.empty()) return; T node1; while(!m_stack1.empty()) { m_stack1.pop(node1); m_stack2.push(node1); } } m_stack1.push(node);</span> <span style="white-space:pre"> </span> } template <typename T> void CQueue<T>::deleteHead() { T _node; if(m_stack2.empty()) { while(!m_stack1.empty()) { m_stack1.pop(_node); m_stack2.push(_node); } } m_stack2.pop(_node); } template <typename T> void CQueue<T>::pop(T&node) { if(m_stack2.empty()) { T _node; while(!m_stack1.empty()) { m_stack1.pop(_node); m_stack2.push(_node); } } m_stack2.pop(node); } int main() { CQueue<int> q; int i = 1; cout << "insert queue: " << endl; while(i < 10)// { cout << i << ","; q.appendTail(i++); } cout << endl << "pop queue: " << endl; while( i> 1) { int k = -1; q.pop(k); cout << k << ","; i --; } return 0; }
输出结果为:insert queue:
1,2,3,4,5,6,7,8,9,
pop queue:
1,2,3,4,5,6,7,8,9,