数据结构C++队列(数组,链表)

#include<iostream>
using namespace std;

//队列(课本版)

//老祖宗
template<class T>
class queue {
public:
	virtual ~queue(){}

	virtual bool empty()const = 0;//队列为空时返回true,否则返回false
	virtual int size()const = 0;//返回队列中元素个数

	virtual T& front() = 0;//返回队列中头元素
	virtual T& back() = 0;//返回队列尾元素

	virtual void pop() = 0;//队列头元素
    virtual void push(const T& theElement) = 0;//将元素theElement加入队尾
};

//循环队列
template<class T>
class arrayQueue :public queue<T>
{
public:
	//构造函数
	arrayQueue(int initialCapacity = 10);
	~arrayQueue() { delete[] queue; }

	bool empty()const { return queueFront == queueBack; }
	int size()const
	{
		return (arrayLength + queueBack - queueFront) % arrayLength;
	}
	T& front()const;//返回队首元素
	T& back()const;//返回队尾元素
	void pop();//删除队首元素
	void push(const T& theElement);//元素插到队尾
private:
	int queueFront;//与第一个元素在反时针方向上相差一个位置
	int queueBack;//指向最后一个元素
	int arrayLength;//队列数组容量
	T* queue;//元素数组(灵魂)
};

template<class T>
arrayQueue<T>::arrayQueue(int initialCapacity)
{
	//构造函数
	if (initialCapacity < 1)
	{
		//输出错误信息,抛出异常
		arrayLength = initialCapacity;
		queue = new T[arrayLength];
		queueFront = queueBack = 0;
	}
}
template<class T>
T& arrayQueue<T>::front()const
{
	//返回队首元素
	if (queueFront == queueBack)throw QueueEmpty();  //队空,就不能拿回来队首
	return queue[(queueFront + 1) % arrayLength];
}

template<class T>
T& arrayQueue<T>::back()const
{
	//返回队尾元素
	if (queueFront == queueBack)throw QueueEmpty();
	return queue[queueBack];
}

template<class T>
void arrayQueue<T>::pop()
{
	//删除队首元素
	if (queueFront == queueBack)throw QueueEmpty();
	queueFront = (queueFront + 1) % arrayLength;
	queue[queueFront].~T();
}
template<class T>
void arrayQueue<T>::push(const T& theElement)
{
	//把元素theElement添加到队列的尾部
	//如果队列空间满,则加倍数组长度
	if (queueBack + 1) % arrayLength == queueFront){}//那就加倍数组长度。。一会写
	queueBack = (queueBack + 1) % arrayLength;
	queue[queueBack] = theElement;

}
//这是个节点
template<class T>
struct chainNode {
	//数据成员
	T element;
	chainNode<T>* next;
	//多个构造函数重载
	chainNode() {}
	chainNode(const T& element)
	{
		this->element = element;
	}
	chainNode(const T& element, const chainNode<T>* next)
	{
		this->element = element;
		this->next = next;
	}
};

//用链表实现
template<class T>
class LinkedQueue :public queue<T>
{
public:
	//构造函数
	LinkedQueue(int initialCapacity = 10);
	~LinkedQueue() {};

	bool empty()const { return queueSize == 0; }
	int size()const { return queueSize; }

	T& front();
	T& back();

	void push(const T& theElement);
	void pop();
private:
	chainNode<T>* queueFront;//队列首指针
	chainNode<T>* queueBack;//队列尾指针
	int queueSize;//队列中元素个数
};

template<class T>
LinkedQueue<T>::LinkedQueue(int initCapacity)
{
	this->queueSize = initCapacity;
	this->queueFront = this->queueBack = new chainNode();
}

template<class T>
T& LinkedQueue<T>::front()
{
	//返回队列首元素
	if (queueSize == 0)throw QueueEmpty();
	return queueFront->element;
}

template <class T>
T& LinkedQueue<T>::back()
{
	//返回队列尾元素
	if (queueSize == 0)throw QueueEmpty();
	return queueBack->element;
}
template <class T>
void LinkedQueue<T>::push(const T& theElement)
{
	//把元素theElement加入到队尾
	//为新元素申请节点
	chainNode<T>* newNode = new chainNode<T>(theElement, NULL);
	//在队列尾部添加新节点
	if (queueSize != 0)
		queueBack->next = newNode;//队列不为空
	else queueFront = newNode;//队列为空
	queueBack = newNode;
	queueSize++;
}

template<class T>
LinkedQueue<T>& LinkedQueue<T>::pop()
{
	//删除队首元素
	if (queueFront == NULL)throw QueueEmpty();

	chainNode<T>* nextNode = queueFront->next;
	delete queueFront;//删除第一个节点
	queueFront = nextNode;
	queueSize--;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值