基于VECTOR的双端队列
题目
1、实现双端队列的插入和删除操作并验证(课本88页);
浅析
什么是双端队列?
双端队列可以在队列的两边进行操作,算法具体细分为头部入队、头部出队、尾部入队、尾部出队等等。
实现思路?
我以Vector向量作为底层数据结构去实现双端队列。
设置front、rear两个标记去进行判别
front指向对列头部第一个数据的位置
rear指向队尾元素的侠义个位置 也就是下一个入队的位置
Vector
vector.assign(capacity,0);
相当于初始化一个数组,其容量为capacity.
代码
DoubleQueue.h
/*
*双端队列
*/
#include<iostream>
#include<vector>
using namespace std;
const int QueueSize=5;
class DoubleQueue
{
private:
/* data */
int front; //front指向对列头部第一个数据的位置
int rear; //指向队尾元素的侠义个位置 也就是下一个入队的位置
int capacity; //容量
vector<int> arr;
public:
DoubleQueue(int k); //k为大小
~DoubleQueue();
void EnQueueHead(int x);
void EnQueueTail(int x);
int DeQueueHead();
int DeQueueTail();
int GetHead();
int GetTail();
bool IsEmpty();
bool IsFull();
};
DoubleQueue.cpp
#include"DoubleQueue.h"
DoubleQueue::DoubleQueue(int k)
{
//初始化空队列
capacity=k+1; //浪费一个位置
arr.assign(capacity,0);
cout<<"初始化一个容量为"<<capacity<<",实际可存储"<<capacity-1<<"个数据的的双端队列"<<endl;
front=0;
rear=0;
}
DoubleQueue::~DoubleQueue()
{
cout<<"析构"<<endl;
}
void DoubleQueue::EnQueueHead(int x)
{
//先判断队列是否已满
if(IsFull())
{
cout<<"队列已满"<<endl;
return;
}
front=(front-1+capacity)%capacity;
arr[front]=x;
cout<<"头部插入成功"<<endl;
}
void DoubleQueue::EnQueueTail(int x)
{
//先判断队列是否已满
if(IsFull())
{
cout<<"队列已满"<<endl;
return;
}
arr[rear]=x;
rear=(rear+1)%capacity;
cout<<"队尾插入成功"<<endl;
}
int DoubleQueue::DeQueueHead()
{
//判断队列是否为空
if(IsEmpty())
{
cout<<"队列为空"<<endl;
return -1;
}
//front是第一个元素的位置
int x=arr[front];
front=(front+1)%capacity;
return x;
}
int DoubleQueue::DeQueueTail()
{
//判断队列是否为空
if(IsEmpty())
{
cout<<"队列为空"<<endl;
return -1;
}
// rear 被设计在数组的末尾,所以要 -1
int x=arr[(rear - 1 + capacity) % capacity];
rear=(rear-1+capacity)%capacity;
return x;
}
int DoubleQueue::GetHead()
{
//判断队列是否为空
if(IsEmpty())
{
cout<<"队列为空"<<endl;
return -1;
}
return arr[front];
}
int DoubleQueue::GetTail()
{
//判断队列是否为空
if(IsEmpty())
{
cout<<"队列为空"<<endl;
return -1;
}
// 当 rear 为 0 时防止数组越界
return arr[(rear - 1 + capacity) % capacity];
}
bool DoubleQueue::IsEmpty()
{
return front==rear;
}
bool DoubleQueue::IsFull()
{
return (rear+1)%capacity==front;
}
测试
main.cpp
#include"DoubleQueue.h"
int main()
{
DoubleQueue d1(5);
d1.EnQueueHead(1);
cout<<"取出当前头部数据为:"<<d1.GetHead()<<endl;
d1.EnQueueHead(2);
cout<<"取出当前头部数据为:"<<d1.GetHead()<<endl;
cout<<"这时的尾部数据为:"<<d1.GetTail()<<endl;
cout<<"-------------------"<<endl;
d1.EnQueueTail(3);
cout<<"这时的尾部数据为:"<<d1.GetTail()<<endl;
cout<<"-------------"<<endl;
cout<<"数据:"<<d1.DeQueueHead()<<"从头部出队"<<endl;
cout<<"这时的队头元素为"<<d1.GetHead()<<endl;
cout<<"这时的尾部元素为"<<d1.GetTail()<<endl;
system("pause");
return 0;
}
运行
课上编写,时间仓促,注释随后补上。