循环队列与链式队列的实现

                                                         循环队列与链式队列的实现

我们了解一下队列:是运算受限的线性表。是一种先进先出(First In First Out ,简称FIFO)的线性表。只允许在表的一端front进行插入,而在另一端rear进行删除。
   队首(front) :允许进行删除的一端称为队首。
   队尾(rear) :允许进行插入的一端称为队尾。

我用两种方式实现了队列,一种是数组存储,一种是单链表。如下,有入队,出队操作,还有判空,求队首元素,队尾元素及队列元素个数。详细如下:

一、循环队列

//循环队列
template
class Queue
{
public:
	Queue()
		:_front(0)
		, _back(0)
		, _count(0)
	{
		for (size_t i = 0; i < N; i++)
		{
			_arr[i] = 0;
		}
	}
	void PushBack(int data)
	{
		if (_count == N)
			return;
		_arr[_back] = data;
		_back++;
		_count++;
		if (N == _back)
			_back = 0;
	}
	void Pop()
	{
		if (_count == 0)
			return;
		_front++;
		_count--;
		if (_front == N)
			_front = 0;
	}
	T& Front()
	{
		return _arr[_front];
	}
	const T& Front()const
	{
		return _arr[_front];
	}
	T& Back()
	{
		return _arr[(_front + _count - 1) % N];
	}
	const T& Back()const
	{
		return _arr[(_front + _count - 1) % N];
	}
	size_t size()
	{
		return _count;
	}
	bool Empty()
	{
		return _front == ((_front+_count-1)%N);
	}
private:
	T _arr[N];
	int _front;
	int _back;
	size_t _count;     //计数器
};

测试如下:

int main()
{
	Queue q;
	q.PushBack(1);
	q.PushBack(2);
	q.PushBack(3);
	q.PushBack(4);

	cout << q.Empty() << endl;
	cout << q.Back() << endl;
	cout << q.Front() << endl;
	cout << q.size() << endl;
	q.PushBack(5);
	cout << q.size() << endl;

	q.Pop();
	cout << q.size() << endl;

	system("pause");
	return 0;
}

循环队列与链式队列的实现_第1张图片
可以看出,5入队前后队列的元素个数都是4,这是因为队列容量为4,5入队时失败。

二、链式队列

与单链表相似,代码为无头单链表,我们需要建立节点。代码如下:

//链式队列
typedef int TypeData;
typedef struct Node
{
	Node(const TypeData& data)
	:_data(data)
	,_pNext(NULL)
	{}
	TypeData _data;
    Node *_pNext;
}*pNode;

class Queue
{
public:
	Queue()
	{
		_front = NULL;
		_back = NULL;
	}
	void PushBack(TypeData data)
	{
		pNode newNode = new Node(data);
		if (_front == NULL)
		{
			_front = newNode;
			_back = newNode;
		}
		_back->_pNext = newNode;
		newNode->_pNext = NULL;
		_back = newNode;
	}
	void Pop()
	{
		if (_back == _front)
		{
			delete _back;
			_front = NULL;
			_back = _front;
		}
		pNode tmp = _front->_pNext;
		delete _front;
		_front = tmp;
	}
	size_t size()
	{
		size_t count = 0;
		pNode tmp = _front;
		while (tmp->_pNext != NULL)
		{
			count++;
			tmp = tmp->_pNext;
		}
		count++;
		return count;
	}
	TypeData Front()
	{
		if (_front == NULL)
			return 0;
		return _front->_data;
	}
	const TypeData Front()const
	{
		if (_front == NULL)
			return 0;
		return _front->_data;
	}
	TypeData Back()
	{
		if (_back == NULL)
			return 0;
		return _back->_data;
	}
	const TypeData Back()const
	{
		if(_back == NULL)
			return 0;
		return _back->_data;
	}
	bool Empty()
	{
		return _front == NULL;
	}
private:
	pNode _front;     //对头指针
	pNode _back;      //队尾指针
};

测试:

int main()
{
	Queue q;
	q.PushBack(1);
	q.PushBack(2);
	q.PushBack(3);
	q.PushBack(4);

	cout << q.Empty() << endl;
	cout << q.Back() << endl;
	cout << q.Front() << endl;

	q.PushBack(5);
	cout << q.size() << endl;

	q.Pop();
	cout << q.size() << endl;

	system("pause");
	return 0;
}
循环队列与链式队列的实现_第2张图片


你可能感兴趣的:(C++,数据结构)