数组实现双端队列


数据结构的设计

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

常用功能

模仿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,欢迎指出!!

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值