堆和栈组合:双端队列c++

本文介绍了双端队列的概念,它允许在两端进行入队和出队操作。通过顺序结构实现循环双端队列,并讨论了队空和队满的判断条件。文中还提供了详细的类定义和类实现。
摘要由CSDN通过智能技术生成

 


双端队列(Deque:double ended queue)就是一个两端都是结尾的队列。队列的每一端都可以插入数据项和移除数据项。相对于普通队列,双端队列的入队和出队操作在两端都可进行。

双端队列的示意图:

left:左端    right:右端

这里我们使用最常用的顺序结构来存储双端队列,为了节省空间,把它首尾相连,构成循环队列。并且规定left指向左端的第一个元素,right指向右端的下一个位置。那么队空的判断则是left==right,队满是(left-1+MAX)%MAX==right或者(right-left+MAX)%MAX==MAX。

详细细节看代码:

类定义和类实现

#include<iostream>
#include<iomanip>
using namespace std;
//队列的最大存储空间为MAX 
const int MAX = 10;
typedef int ElemType;
//双端队列类 
class Deque    //double ended queue
{
private:
    int size;  //队列中元素个数 
    ElemType *base;
    int left, right;  //0代表左端left,1代表右端right
public:
    //构造函数 
    Deque();
    //析构
    ~Deque()
    {
        delete[]base;
    }
    //获取大小
    int getSize()
    {
        return size;
    }
    //队空判断 
    bool empty()
    {
        return left == right;
    }  //或者size==0 
    //队满判断
    bool full()
    {
        return (left - 1 + MAX) % MAX == right;
    }
    //获取指定端的头元素
    bool topAt(ElemType&, int);
    //在指定端插入(入队) 
    bool pushAt(ElemType, int);
    //在指定端删除(出队) 
    bool popAt(int);
    //从指定端打印队列 
    void print(int);
    //请空队列
    void clear();
};
Deque::Deque()
{
    base = new ElemType[MAX];
    left = right = 0;
    size = 0;
}
bool Deque::topAt(ElemType& data, int end)
{
    if (empty())
        return false;
    if (end == 0)
        data = base[left];
    else
        data = base[(right - 1 + MAX) % MAX];
    return true;
}
bool Deque::pushAt(ElemType data, int end)
{
    if (full())
        return false;
    if (end == 0)
    {
        left = (left - 1 + MAX) % MAX;
        base[left] = data;
    }
    else
    {
        base[right] = data;
        right = (right + 1) % MAX;
    }
    return true;
}
bool Deque::popAt(int end)
{
    if (empty())
        return false;
    if (end == 0)
        left = (left + 1) % MAX;
    else
        right = (right - 1 + MAX) % MAX;
    return true;
}
void Deque::print(int end)
{
    if (empty())
    {
        cout << "空队列,无法遍历!" << endl;
        return;
    }
    if (end == 0)
    {
        int i = left;
        while (i != right)
        {
            cout << setw(4) << base[i];
            i = (i + 1) % MAX;
        }
    }
    else
    {
        int i = right;
        while (i != left)
        {
            i = (i - 1 + MAX) % MAX;
            cout << setw(4) << base[i];
        }
    }
    cout << endl;
}
void Deque::clear()
{
    left = right = 0;
    size = 0;
}
主函数和相关方法:

void check(int& end)  //对端号进行检查
{
    while (cin >> end && !(end == 0 || end == 1))
    {
        cout << "端号不对,重新输入:";
    }
}
void input(Deque& deque)  //输入函数
{
    int end;
    cout << "在指定端入队,0左端,1右端:";
    check(end);
    ElemType data;
    cout << "输入数据,输入0结束" << endl;
    while (cin >> data && data)
    {
        deque.pushAt(data, end);
    }
}
void traverse(Deque& deque)   //从指定端遍历
{
    int end;
    cout << "从指定端遍历:";
    check(end);
    deque.print(end);
}
int main()
{
    cout << "******双端队列演练******" << endl;
    Deque deque;
    cout << "新建双端队列" << endl;
    cout << "队列是否为空:";
    deque.empty() ? cout << "Yes!" << endl : cout << "No!" << endl;
    input(deque);
    traverse(deque);
    input(deque);
    traverse(deque);
    ElemType data;
    int end;
    cout << "获取指定定端的头元素:";
    check(end);
    deque.topAt(data, end) ? cout << data << endl : cout << "队空!" << endl;
    cout << "删除指定定端的头元素:";
    check(end);
    deque.popAt(end) ? cout << "删除成功" << endl : cout << "队空!" << endl;
    traverse(deque);
    cout << "清空队列,队列是否为空:";
    deque.clear();
    deque.empty() ? cout << "Yes!" << endl : cout << "No!" << endl;
    system("pause");
    return 0;
}

运行:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值