基于VECTOR的双端队列

基于VECTOR的双端队列

题目

1、实现双端队列的插入和删除操作并验证(课本88页);

浅析

什么是双端队列?

双端队列可以在队列的两边进行操作,算法具体细分为头部入队、头部出队、尾部入队、尾部出队等等。

实现思路?

我以Vector向量作为底层数据结构去实现双端队列。

设置front、rear两个标记去进行判别

front指向对列头部第一个数据的位置

rear指向队尾元素的侠义个位置 也就是下一个入队的位置

image-20210929114303315

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;
}

运行

image-20210929114535324

课上编写,时间仓促,注释随后补上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值