对于这个问题的分析,我们可以转换为两个栈之间的来回循环倒的一个问题。
在这,我们应该清楚,两个数据结构的数据特性,一个是先进后出(栈),一个是后进先出(队列),所以,我们在这里可以这样分析:
当我们入队操作的时候,对第一个栈进行压栈;如果我们想要出栈的时候,这个时候其实是要出栈的是第一个栈的栈底元素。
所以这个时候我们把第一个栈栈顶元素push进入第二个栈,然后pop,这样依次到第一个栈空。
然后我们再pop第二个栈顶元素的top,这样就是实现了出队。
具体代码实现:
#pragma once #include<iostream> #include<stack> #include<assert.h> using namespace std; template<typename T> class CQueue { public: // CQueue(void); // ~CQueue(void); void appendTail(const T& node); //尾插 T deleteHead(); //头删 size_t size(); //大小 bool empty(); //判空 T& front(); //得到头 T& back(); //得到尾 void print(); //输出队列 private: stack<T> stack1; stack<T> stack2; }; template<typename T> T& CQueue<T>::back() //得到尾 { assert((!stack1.empty())||(!stack2.empty())); /*这个顺序是不能变的*/ if(stack1.empty()) //如果第一个栈是空的 { //说明给导到第二个栈里去了 while(!stack2.empty()) //把第二个栈的东西再倒回去 { stack1.push(stack2.top()); stack2.pop(); } } return stack1.top(); } template<typename T> T& CQueue<T>::front() //得到头 { assert((!stack1.empty()) || (!stack2.empty())); if(stack2.empty()) { while(!stack1.empty()) { stack2.push(stack1.top()); stack1.pop(); } } return stack2.top(); } template<typename T> size_t CQueue<T>::size()//大小 { return stack1.size()+stack2.size(); } template<typename T> bool CQueue<T>::empty() //判空 { return stack1.empty()&&stack2.empty(); } template<typename T> //尾插 void CQueue<T>::appendTail(const T& element) { stack1.push(element); } template<typename T> //头删且返回删去的 T CQueue<T>::deleteHead() { if(stack2.size() <= 0) { while(stack1.size()> 0) { T &data = stack1.top(); stack1.pop(); stack2.push(data); } } if(stack2.size() == 0) { cout<<"_error:"; throw new exception("queue is empty"); } T head = stack2.top(); stack2.pop(); return head; } 测试函数: #include"CQueue.h" #define N 5 int main() { CQueue<int> cq; int base[N] = {1,8,3,6,7}; for(int i = 0;i<N;++i) { cq.appendTail(base[i]); } cout<<cq.size()<<endl; cq.appendTail(14); cout<<cq.back()<<"是尾"<<endl; cout<<cq.front()<<"是头"<<endl; int len = cq.size(); for(int i = 0;i<len;++i) { cout<<cq.deleteHead()<<"-->"; } cout<<endl; return 0; }