数据结构——双向队列

  • Post author:
  • Post category:其他


1.介绍

双端队列,就是

两头都可操作

即出队和进队的一种数据结构。

个人理解,就是两个队列的操作作用于一个队列的结构。

假如,把一端的操作给去掉,则双端队列的结构将退化成栈。因此,栈所能做的操作双端队列也是可以的。

2.操作

其实大部分的操作其实和循环队列没什么不同,至少判空和判满函数是相同的。只是对于循环队列

多了两个函数出队和入队

只着重介绍和循环队列不同的地方。

对于循环队列,我们用head指向队首元素,tail指向队尾元素后一个位置。那么,对于双端队列的一端我们可以使用上面的指针。

另一端,其实就不需要再另外声明两个变量了,其实

(tail-1)%maxSize

和(

head-1)%maxSize

就分别是另一端的首尾指针了。

双端队列对于用链表实现可能更好一点,因为它不需要考虑队满的情况,也不需要考虑循环一些的问题。下面是顺序结构的总的代码。

#pragma once
template<typename T>
class DeQueue
{
	T* data;
	int head;
	int tail;
	int maxSize;
	void resize();
public:
	DeQueue();
	~DeQueue();
	bool isFull();
	bool isEmpty();
	void push1(const T& val);
	void push2(const T& val);
	bool pop1();
	bool pop2();
	const T& getFront1();
	const T& getFront2();
};
template<typename T>
void DeQueue<T>::resize()
{
	T* p = data;
	data = new T[maxSize * 2];
	//无论是tail>head还是tail<head都把他复制到新的内存,新的内存从0开始
	for (int i = head; ((i + maxSize) % maxSize) < tail; i++)
		data[i - head] = p[i];
	head = 0;
	tail = maxSize - 1;
	maxSize *= 2;
	delete[]p;
}
template<typename T>
DeQueue<T>::DeQueue()
{
	data = new T[10];
	head = tail = 0;
	maxSize = 10;
}
template<typename T>
DeQueue<T>::~DeQueue()
{
	delete[]data;
}
template<typename T>
bool DeQueue<T>::isFull()
{
	if ((tail + 1) % maxSize == head)
		return true;
	return false;
}
template<typename T>
bool DeQueue<T>::isEmpty()
{
	if (head == tail)
		return true;
	return false;
}
template<typename T>
void DeQueue<T>::push1(const T& val)
{
	if (isFull())
		resize();
	data[tail] = val;
	tail = (tail + 1) % maxSize;
}
template<typename T>
void DeQueue<T>::push2(const T& val)
{
	if (isFull())
		resize();
	head = (head - 1) % maxSize;
	data[head] = val;
}
template<typename T>
bool DeQueue<T>::pop1()
{
	if (isEmpty())
		return false;
	head = (head + 1) % maxSize;
	return true;
}
template<typename T>
bool DeQueue<T>::pop2()
{
	if (isEmpty())
		return false;
	tail = (tail - 1) % maxSize;
	return true;
}
template<typename T>
const T& DeQueue<T>::getFront1()
{
	if (isEmpty())
		throw("error");
	return data[head];
}
template<typename T>
const T& DeQueue<T>::getFront2()
{
	if (isEmpty())
		throw("error");
	return data[((tail-1)%maxSize)];
}



版权声明:本文为cdz2470原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。