データ構造学習のチェーンキューc++実装

3332 ワード

//   ,c++  

#include <iostream>
using namespace std;

template <class Telem> class  Queue
{
public:
	virtual void init()=0;         //   
	virtual int  leng()=0;         //   
	virtual bool full()=0;         //    
	virtual bool empt()=0;         //    
	virtual bool enque (Telem el)=0;
	// el    ,      true    false
	virtual Telem dlque()=0;
	//                   ,    NULL
	virtual Telem getf()=0;
	//           ,    NULL
};

template <class Telem> class  LinkQueue;
template <class Telem> class Node
{ 
	friend class  LinkQueue <Telem>;
	Telem data;
	Node <Telem> *next;
public:
	Node(Telem d=0,Node <Telem> *n=NULL):data(d),next(n){};
};
template <class Telem>
class  LinkQueue  :public Queue<Telem>
{
private:
	Node <Telem> *front,*rear;
public:
	LinkQueue()//  :        , front rear  ,            NULL。
	{ 
		Node <Telem> *p;
		p=new  Node <Telem>;
		p->next=NULL;
		front=rear=p;
	}
	~LinkQueue()//  :                 。 
	{ 
		Node <Telem> *p,*q;
		p=front;
		while(p!=rear){
			q=p;
			p=p->next;
			delete q;
		};
		delete p;
	}

		void init(){ front->next=NULL;  rear=front; };
		int  leng();
		bool enque(Telem el);
		Telem dlque();
		Telem getf(){return front->next->data;};
		bool empt(){return front==rear;};
		bool full(){return false;};
};

template <class Telem> int LinkQueue <Telem>::leng()
{ 
	Node <Telem> *p;  
	int i;
	p= front->next;
	i=0;
	while (p!= NULL ) {
		i++; 
		p=p->next; 
	}
	return i;
};

template <class Telem> bool LinkQueue <Telem>::enque(Telem el)
{ 
	Node <Telem> *p;
	p= new Node <Telem>;
	p->data=el;
	p->next=NULL;
	rear->next=p;
	rear=p;
	return true;
};

template <class Telem> Telem LinkQueue <Telem>::dlque()
{ 
	Node <Telem> *s; Telem el;
	if (front==rear) 
		return NULL;
	else { 
		s=front->next; 
		front->next=s->next;
		if (s->next==NULL ) 
			rear =front;
		el=s->data; 
		delete s; 
		return el;
	}
};


void prnt(Queue<char>& q)
{ 
	LinkQueue<char> sq; char ch;
	while(!q.empt())
	{
		ch=q.dlque();
		cout<<ch<<" ";
		sq.enque(ch);
	}
	cout<<endl;
	while(!sq.empt()) 
	{
       	ch=sq.dlque();
		q.enque(ch);  

	}
}


int main(){
	LinkQueue<char> lq;
	lq.enque('x');  
	lq.enque('w');
	lq.enque('y');
	lq.enque('g');
	lq.enque('j');
	prnt(lq);
	cout<<lq.dlque()<<endl;
	cout<<lq.dlque()<<endl;
	cout<<lq.getf()<<endl;
	prnt(lq);
	
	return 0;
}