用两个栈实现队列

来源:互联网 发布:自学软件编程 编辑:程序博客网 时间:2024/06/07 09:15

对于这个问题的分析,我们可以转换为两个栈之间的来回循环倒的一个问题。 

在这,我们应该清楚,两个数据结构的数据特性,一个是先进后出(栈),一个是后进先出(队列),所以,我们在这里可以这样分析: 

当我们入队操作的时候,对第一个栈进行压栈;如果我们想要出栈的时候,这个时候其实是要出栈的是第一个栈的栈底元素。

所以这个时候我们把第一个栈栈顶元素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 5int 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;}


0 0