数组实现双端队列

文章目录

      • 数据结构的设计
      • 常用功能
      • 具体实现
      • 测试
      • 写在最后


数据结构的设计

借助了循环队列的思想,使得该双端队列能够得到充分使用。
**难点是如何判空和判满?**牺牲两个单元来区分队首和队尾,如果队首的下一个元素就是队尾就说明队列为空;如果队尾的下一个元素是队首,说明队列已满。

常用功能

模仿STL中deque用数组实现双端队列。
int size():返回队列长度
bool empty():判断队列是否为空
int front():返回队首元素
int back():返回队尾元素
void push_back(int val):队尾插入元素
void push_front(int val):队首删除元素
void pop_back():队尾删除元素
void pop_front():队首删除元素

具体实现

struct Deque {
	int head, rear, max_length;
	int q[DEQUE_SIZE];
	// 构造函数 
	Deque() {
		head = 0;
		rear = 1;
		max_length = DEQUE_SIZE; //最大容量
	}
	// 清空
	void clear() {
		head = 0;
		rear = 1;
	}
	// 判空 
	bool empty() {
		if((head + 1) % max_length == rear) {
			return true;
		}
		return false;
	}
	// 判满 
	bool full() {
		if((rear + 1) % max_length == head) {
			return true;
		}
		return false;
	}
	// 队列长度 
	int size() {
		return (rear - head - 1 + max_length) % max_length;
	}
	// 返回队首元素
	int front() {
		if(empty()) return -1; //队列为空 
		return q[(head + 1) % max_length];
	}
	// 返回队尾元素 
	int back() {
		if(empty()) return -1; //队列为空 
		return q[(rear - 1 + max_length) % max_length];
	} 
	// 队尾插入元素 
	void push_back(int val) {
		if(full()) return; // 队列满了
		q[rear] = val;
		rear = (rear + 1) % max_length; 
	}
	// 队首插入元素
	void push_front(int val) {
		if(full()) return; // 队列满了
		q[head] = val;
		head = (head - 1 + max_length) % max_length; 
	}
	// 队尾删除元素 
	void pop_back() {
		if(empty()) return; //队列为空 
		rear = (rear - 1 + max_length) % max_length;
	}
	// 队首删除元素 
	void pop_front() {
		if(empty()) return; //队列为空 
		head = (head + 1) % max_length;
	}
};

测试

利用STL的deque和我实现的deque同步操作进行测试,测试函数如下:

void test() {
	deque<int> dq;
	struct Deque mydq;
	
	dq.push_back(10);
	mydq.push_back(10);
	cout << dq.front() << endl;
	cout << mydq.front() << endl;
	dq.pop_front();
	mydq.pop_front();
	if(dq.empty()) cout << "the deque is empty." << endl;
	if(mydq.empty()) cout << "the mydeque is empty." << endl;
	for(int i = 0; i < 10; i++) {
		dq.push_front(i);
		mydq.push_front(i);
	}
	cout << dq.size() << endl;
	cout << mydq.size() << endl;
	cout << dq.front() << endl;
	cout << mydq.front() << endl;
	cout << dq.back() << endl;
	cout << mydq.back() << endl; 
}

输出是一致的:

10
10
the deque is empty.
the mydeque is empty.
10
10
9
9
0
0

写在最后

由于时间仓促,并没有充分测试该数据结构。如果有BUG,欢迎指出!!

你可能感兴趣的:(算法,&,数据结构)