数据结构的设计
借助了循环队列的思想,使得该双端队列能够得到充分使用。
**难点是如何判空和判满?**牺牲两个单元来区分队首和队尾,如果队首的下一个元素就是队尾就说明队列为空;如果队尾的下一个元素是队首,说明队列已满。
常用功能
模仿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,欢迎指出!!