队列(链式存储)C++模板实现

#include <iostream>
using namespace std;


//队列结点类
template <typename T>
class QueueNode{
	private:
		T data; //结点数值部分
		QueueNode<T> * next;  //指向下一结点
	public:
		QueueNode(T d=0 , QueueNode<T> *n=NULL){  //构造函数
			data= d;
			next=n;
		};
		void setData(T d){  //设置数值部分
			data = d;
		}
		void setNext(QueueNode<T> * n){  //设置next
			next = n;
		}
		T getData() const {  //返回数值部分
			return data;
		}
		QueueNode<T> * getNext() const{  //返回next
			return next;
		}
};

//队列类
template <typename T>
class Queue{
	private:
		int num;  //队列结点个数
		QueueNode<T> *front,*rear; //front队首指针(出队的一端),rear队尾指针(入队的一端)。
	public:
		Queue(){  //队列类构造函数
			num=0;
			front=NULL;
			rear=NULL;
		}
		~Queue(){  //释放整个队列空间即释放整个链表	
			while(front){
				QueueNode<T> * p = front;	
				front = front->getNext();
				delete p;
			}
		}
		void In(T x);  //一个值为x的结点进队
		void Out();  //队首结点出队
		T getFront() const; //获得队首结点的值
		bool isEmpty() const;  //判断队列是否为空
		int getLength() const; //获得队列长度
		void printAll() const; //打印整个队列
};

//一个值为x的结点进队,实现部分
template <typename T>
void Queue<T>::In(T x){
	if(isEmpty())
		front=rear=new QueueNode<T>(x);
	else {
		QueueNode<T> *p= new QueueNode<T>(x);
		rear->setNext(p);
		rear = p;
	}
	num++;
}

//队首结点出队,实现部分
template <typename T>
void Queue<T>::Out(){
	QueueNode<T> *p=front;
	front = front->getNext();
	delete p;
	num--;
}

 //获得队首结点的值,实现部分
template <typename T>
T Queue<T>::getFront() const {
	return front->getData();
}

//判断队列是否为空,实现部分
template <typename T>
bool Queue<T>::isEmpty() const {
	return num==0;
}

//获得队列长度,实现部分
template <typename T>
int Queue<T>::getLength() const {
	return num;
}

//打印整个队列,实现部分
template <typename T>
void Queue<T>::printAll() const{
	if(isEmpty())
		cout<<"队列为空"<<endl;
	else{
		QueueNode<T> *p =front;
		int i =1;
		while(p){
			cout<<"第"<<i<<"个结点:"<<p->getData()<<endl;
			p = p->getNext();
			i++;
		}
	}
}
void main(){
	Queue<int> a; //创建队列
	cout<<"队列初始长度:"<<a.getLength()<<endl<<endl;
	a.In(1);  //值为1的结点进队
	a.In(2);  //值为2的结点进队
	a.In(3);  //值为3的结点进队
	a.In(4);  //值为4的结点进队
	a.In(5);  //值为5的结点进队
	cout<<"队列长度:"<<a.getLength()<<endl;
	a.printAll();  //打印队列
	a.Out();  //队首结点出队
	a.Out();  //队首结点出队
	cout<<endl<<"队列长度:"<<a.getLength()<<endl;
	a.printAll(); //打印队列
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值