队列

************************* seqQueue.cpp *************************
#include <iostream>

template <typename T, int maxsize = 30> //设置最大容量
class SeqQueue
{
public:
	SeqQueue()
	{
		first = last = 0; //初始时下标重叠
		cursize = 0;
	}
	~SeqQueue()
	{
		clear();
	}
	void clear()
	{
		while(!isEmpty())
		{
			dequeue();
		}
	}
	bool isEmpty()
	{
		return cursize == 0;
	}
	bool isFull() //检查队列是否已满,防止意外的覆盖
	{
		return cursize == maxsize;
	}
	void enqueue(const T& el)
	{
		if(!isFull())
		{
			storage[last] = el;            //存入元素
			last = ( last + 1 ) % maxsize; //下标后移
			cursize++;                     //计数加一
		}
		else
		{
			throw("Full Queue \n");
		}
	}
	T dequeue()
	{
		T tmp;
		if(!isEmpty())
		{
			tmp = storage[first];
			first = ( first + 1 ) % maxsize; //下标后移,此数据之后将被覆盖
			cursize--;
		}
		else
		{
			throw("Empty Queue \n");
		}
		return tmp;
	}
	T firstEl()
	{
		T tmp;
		if(!isEmpty())
		{
			tmp = storage[first];
		}
		else
		{
			throw("Empty Queue \n");
		}
		return tmp;
	}
private:
	T storage [maxsize];
	int cursize;     //当前元素个数
	int first, last; //首尾元素下标(last下标其实指向最后一个元素的下一个位置)
};
************************* linkQueue.cpp *************************
#include <iostream>
#include <list>

template <typename T>
class linkQueue
{
public:
	linkQueue(){}
	~linkQueue()
	{
		clear();
	}
	void clear()
	{
		lst.clear();
	}
	bool isEmpty()
	{
		return lst.empty();
	}
	void enqueue(const T& el)
	{
		lst.push_back(el);
	}
	T dequeue()
	{
		T tmp = lst.front(); //front():返回链表第一个节点
		lst.pop_front();     //pop_front():删除第一个节点
		return tmp;
	}
	T firstEl()
	{
		return lst.front();
	}
private:
	list<T> lst;
};
************************* listQueue.cpp *************************
#include <iostream>

template <typename T>
typedef struct QueueNode
{
	T value;
	QueueNode *next;
}node;

template <typename T>
class ListQueue
{
public:
	ListQueue()
	{
		head = tail = NULL;
	}
	~ListQueue()
	{
		clear();
	}
	void clear();
	bool isEmpty();
	void enqueue(const T& el);
	T dequeue();
	T firstEl();
private:
	node *head, *tail; //使用两个指针指向首尾节点
};

template <typename T>
void QueueNode<T>::clear()
{
	while(!isEmpty())
	{
		dequeue();
	}
}

template <typename T>
bool QueueNode<T>::isEmpty()
{
	return ( head == tail && head == NULL );
}

template <typename T>
void QueueNode<T>::enqueue(const T& el)
{
	node *pNew = new node(); //动态生成
	pNew->value = el;
	pNew->next = NULL;
	
	if(isEmpty())
	{
		head = tail = pNew;
	}
	else
	{
		tail->next = pNew;
		tail = pNew;
	}
}

template <typename T>
T QueueNode<T>::dequeue()
{
	T tmp;
	if(!isEmpty())
	{
		node *pTmp;
		if( head == tail ) //只有一个元素需特殊处理
		{
			pTmp = head;
			head = tail = NULL;
		}
		else
		{
			pTmp = head;
			head = head->next;
		}
	}
	else
	{
		throw("Empty Queue");
	}
	delete pTmp;
	return tmp;
}

template <typename T>
T QueueNode<T>::firstEl()
{
	T tmp;
	if(!isEmpty())
	{
		tmp = head->value;
	}
	else
	{
		throw("Empty Queue");
	}
	return tmp;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值