C++数据结构 利用双端队列deque实现双端栈
希望用模板实现,求思路和代码
[解决办法]
- C/C++ code
7.顺序队列SeqQueue.htemplate<typename Type> class SeqQueue{public: SeqQueue(int sz):m_nrear(0),m_nfront(0),m_ncount(0),m_nMaxSize(sz){ m_pelements=new Type[sz]; if(m_pelements==NULL){ cout<<"Application Error!"<<endl; exit(1); } } ~SeqQueue(){ delete[] m_pelements; } void MakeEmpty(); //make the queue empty bool IsEmpty(); bool IsFull(); bool Append(const Type item); //insert data Type Delete(); //delete data Type Get(); //get data void Print(); //print the queueprivate: int m_nrear; int m_nfront; int m_ncount; int m_nMaxSize; Type *m_pelements; };template<typename Type> void SeqQueue<Type>::MakeEmpty(){ this->m_ncount=0; this->m_nfront=0; this->m_nrear=0;}template<typename Type> bool SeqQueue<Type>::IsEmpty(){ return m_ncount==0;}template<typename Type> bool SeqQueue<Type>::IsFull(){ return m_ncount==m_nMaxSize;}template<typename Type> bool SeqQueue<Type>::Append(const Type item){ if(IsFull()){ cout<<"The queue is full!"<<endl; return 0; } m_pelements[m_nrear]=item; m_nrear=(m_nrear+1)%m_nMaxSize; m_ncount++; return 1;}template<typename Type> Type SeqQueue<Type>::Delete(){ if(IsEmpty()){ cout<<"There is no element!"<<endl; exit(1); } Type temp=m_pelements[m_nfront]; m_nfront=(m_nfront+1)%m_nMaxSize; m_ncount--; return temp;}template<typename Type> Type SeqQueue<Type>::Get(){ if(IsEmpty()){ cout<<"There is no element!"<<endl; exit(1); } return m_pelements[m_nfront];}template<typename Type> void SeqQueue<Type>::Print(){ cout<<"front"; for(int i=0;i<m_ncount;i++){ cout<<"--->"<<m_pelements[(m_nfront+i+m_nMaxSize)%m_nMaxSize]; } cout<<"--->rear"<<endl<<endl<<endl;}Test.cpp#include <iostream>using namespace std;#include "SeqQueue.h"int main(){ SeqQueue<int> queue(10); int init[10]={1,6,9,0,2,5,8,3,7,4}; for(int i=0;i<5;i++){ queue.Append(init[i]); } queue.Print(); cout<<queue.Delete()<<endl; queue.Print(); for(int i=5;i<10;i++){ queue.Append(init[i]); } queue.Print(); cout<<queue.Get()<<endl; queue.MakeEmpty(); queue.Print(); queue.Append(1); queue.Print(); return 0;}8、链式队列QueueNode.htemplate<typename Type> class LinkQueue;template<typename Type> class QueueNode{private: friend class LinkQueue<Type>; QueueNode(const Type item,QueueNode<Type> *next=NULL) :m_data(item),m_pnext(next){}private: Type m_data; QueueNode<Type> *m_pnext;};LinkQueue.h#include "QueueNode.h"template<typename Type> class LinkQueue{public: LinkQueue():m_prear(NULL),m_pfront(NULL){} ~LinkQueue(){ MakeEmpty(); } void Append(const Type item); //insert data Type Delete(); //delete data Type GetFront(); //get data void MakeEmpty(); //make the queue empty void Print(); //print the queue bool IsEmpty() const{ return m_pfront==NULL; }private: QueueNode<Type> *m_prear,*m_pfront;};template<typename Type> void LinkQueue<Type>::MakeEmpty(){ QueueNode<Type> *pdel; while(m_pfront){ pdel=m_pfront; m_pfront=m_pfront->m_pnext; delete pdel; }}template<typename Type> void LinkQueue<Type>::Append(const Type item){ if(m_pfront==NULL){ m_pfront=m_prear=new QueueNode<Type>(item); } else{ m_prear=m_prear->m_pnext=new QueueNode<Type>(item); }}template<typename Type> Type LinkQueue<Type>::Delete(){ if(IsEmpty()){ cout<<"There is no element!"<<endl; exit(1); } QueueNode<Type> *pdel=m_pfront; Type temp=m_pfront->m_data; m_pfront=m_pfront->m_pnext; delete pdel; return temp;}template<typename Type> Type LinkQueue<Type>::GetFront(){ if(IsEmpty()){ cout<<"There is no element!"<<endl; exit(1); } return m_pfront->m_data;}template<typename Type> void LinkQueue<Type>::Print(){ QueueNode<Type> *pmove=m_pfront; cout<<"front"; while(pmove){ cout<<"--->"<<pmove->m_data; pmove=pmove->m_pnext; } cout<<"--->rear"<<endl<<endl<<endl;}Test.cpp#include <iostream>using namespace std;#include "LinkQueue.h"int main(){ LinkQueue<int> queue; int init[10]={1,3,6,8,9,2,0,5,4,7}; for(int i=0;i<10;i++){ queue.Append(init[i]); } queue.Print(); queue.Delete(); queue.Print(); cout<<queue.GetFront()<<endl; queue.Print(); queue.MakeEmpty(); queue.Print(); queue.Delete(); return 0;}9、优先级队列QueueNode.htemplate<typename Type,typename Cmp> class PriorityQueue;template<typename Type,typename Cmp> class QueueNode{private: friend class PriorityQueue<Type,Cmp>; QueueNode(const Type item,QueueNode<Type,Cmp> *next=NULL) :m_data(item),m_pnext(next){}private: Type m_data; QueueNode<Type,Cmp> *m_pnext;};Compare.htemplate<typename Type> class Compare{ //处理一般比较大小public: static bool lt(Type item1,Type item2);};template<typename Type> bool Compare<Type>::lt(Type item1, Type item2){ return item1<item2;}struct SpecialData{ friend ostream& operator<<(ostream& ,SpecialData &); int m_ntenor; int m_npir;};ostream& operator<<(ostream& os,SpecialData &out){ os<<out.m_ntenor<<" "<<out.m_npir; return os;}class SpecialCmp{ //处理特殊比较大小,用户可添加适当的类public: static bool lt(SpecialData item1,SpecialData item2);};bool SpecialCmp::lt(SpecialData item1, SpecialData item2){ return item1.m_npir<item2.m_npir;}PriorityQueue.h#include "QueueNode.h"#include "Compare.h"template<typename Type,typename Cmp> class PriorityQueue{ //Cmp is Designed for comparepublic: PriorityQueue():m_prear(NULL),m_pfront(NULL){} ~PriorityQueue(){ MakeEmpty(); } void MakeEmpty(); //make the queue empty void Append(const Type item); //insert data Type Delete(); //delete data Type GetFront(); //get data void Print(); //print the queue bool IsEmpty() const{ return m_pfront==NULL; } private: QueueNode<Type,Cmp> *m_prear,*m_pfront;};template<typename Type,typename Cmp> void PriorityQueue<Type,Cmp>::MakeEmpty(){ QueueNode<Type,Cmp> *pdel; while(m_pfront){ pdel=m_pfront; m_pfront=m_pfront->m_pnext; delete pdel; }}template<typename Type,typename Cmp> void PriorityQueue<Type,Cmp>::Append(const Type item){ if(m_pfront==NULL){ m_pfront=m_prear=new QueueNode<Type,Cmp>(item); } else{ m_prear=m_prear->m_pnext=new QueueNode<Type,Cmp>(item); }}template<typename Type,typename Cmp> Type PriorityQueue<Type,Cmp>::Delete(){ if(IsEmpty()){ cout<<"There is no elements!"<<endl; exit(1); } QueueNode<Type,Cmp> *pdel=m_pfront,*pmove=m_pfront; while(pmove->m_pnext){ //get the minimize priority's data //cmp:: lt is used for compare the two data, if the front one // is less than the back, then return 1 if(Cmp::lt(pmove->m_pnext->m_data,pdel->m_pnext->m_data)){ pdel=pmove; } pmove=pmove->m_pnext; } pmove=pdel; pdel=pdel->m_pnext; pmove->m_pnext=pdel->m_pnext; Type temp=pdel->m_data; delete pdel; return temp;}template<typename Type,typename Cmp> Type PriorityQueue<Type,Cmp>::GetFront(){ if(IsEmpty()){ cout<<"There is no elements!"<<endl; exit(1); } QueueNode<Type,Cmp> *pdel=m_pfront,*pmove=m_pfront->m_pnext; while(pmove){ //get the minimize priority's data if(Cmp::lt(pmove->m_data,pdel->m_data)){ pdel=pmove; } pmove=pmove->m_pnext; } return pdel->m_data;}template<typename Type,typename Cmp> void PriorityQueue<Type,Cmp>::Print(){ QueueNode<Type,Cmp> *pmove=m_pfront; cout<<"front"; while(pmove){ cout<<"--->"<<pmove->m_data; pmove=pmove->m_pnext; } cout<<"--->rear"<<endl<<endl<<endl;}Test.cpp#include <iostream>#include <cstdlib>using namespace std;#include "PriorityQueue.h"int main(){ PriorityQueue<int,Compare<int> > queue; int init[10]={1,9,3,5,0,8,2,4,6,7}; for(int i=0;i<10;i++){ queue.Append(init[i]); } queue.Print(); queue.Delete(); queue.Print(); system("pause"); system("cls"); PriorityQueue<SpecialData,SpecialCmp> spe_queue; int init2[5][2]={{34,2},{64,1},{18,3},{24,2},{55,4}}; SpecialData data[5]; for(int i=0;i<5;i++){ data[i].m_npir=init2[i][1]; data[i].m_ntenor=init2[i][0]; } for(int i=0;i<5;i++){ spe_queue.Append(data[i]); } spe_queue.Print(); cout<<spe_queue.GetFront()<<endl<<endl; spe_queue.Delete(); spe_queue.Print(); return 0;}