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

举报
风吹稻花香 发表于 2021/06/04 23:16:12 2021/06/04
【摘要】   双端队列(Deque:double ended queue)就是一个两端都是结尾的队列。队列的每一端都可以插入数据项和移除数据项。相对于普通队列,双端队列的入队和出队操作在两端都可进行。 双端队列的示意图: left:左端    right:右端 这里我们使用最常用的顺序结构来存储双端队列,为了节省空间,把它首尾相连,构成...

 


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

双端队列的示意图:

left:左端    right:右端

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

详细细节看代码:

类定义和类实现


  
  1. #include<iostream>
  2. #include<iomanip>
  3. using namespace std;
  4. //队列的最大存储空间为MAX 
  5. const int MAX = 10;
  6. typedef int ElemType;
  7. //双端队列类 
  8. class Deque    //double ended queue
  9. {
  10. private:
  11.     int size;  //队列中元素个数 
  12.     ElemType *base;
  13.     int left, right;  //0代表左端left,1代表右端right
  14. public:
  15.     //构造函数 
  16.     Deque();
  17.     //析构
  18.     ~Deque()
  19.     {
  20.         delete[]base;
  21.     }
  22.     //获取大小
  23.     int getSize()
  24.     {
  25.         return size;
  26.     }
  27.     //队空判断 
  28.     bool empty()
  29.     {
  30.         return left == right;
  31.     }  //或者size==0 
  32.     //队满判断
  33.     bool full()
  34.     {
  35.         return (left - 1 + MAX) % MAX == right;
  36.     }
  37.     //获取指定端的头元素
  38.     bool topAt(ElemType&, int);
  39.     //在指定端插入(入队) 
  40.     bool pushAt(ElemType, int);
  41.     //在指定端删除(出队) 
  42.     bool popAt(int);
  43.     //从指定端打印队列 
  44.     void print(int);
  45.     //请空队列
  46.     void clear();
  47. };
  48. Deque::Deque()
  49. {
  50.     base = new ElemType[MAX];
  51.     left = right = 0;
  52.     size = 0;
  53. }
  54. bool Deque::topAt(ElemType& data, int end)
  55. {
  56.     if (empty())
  57.         return false;
  58.     if (end == 0)
  59.         data = base[left];
  60.     else
  61.         data = base[(right - 1 + MAX) % MAX];
  62.     return true;
  63. }
  64. bool Deque::pushAt(ElemType data, int end)
  65. {
  66.     if (full())
  67.         return false;
  68.     if (end == 0)
  69.     {
  70.         left = (left - 1 + MAX) % MAX;
  71.         base[left] = data;
  72.     }
  73.     else
  74.     {
  75.         base[right] = data;
  76.         right = (right + 1) % MAX;
  77.     }
  78.     return true;
  79. }
  80. bool Deque::popAt(int end)
  81. {
  82.     if (empty())
  83.         return false;
  84.     if (end == 0)
  85.         left = (left + 1) % MAX;
  86.     else
  87.         right = (right - 1 + MAX) % MAX;
  88.     return true;
  89. }
  90. void Deque::print(int end)
  91. {
  92.     if (empty())
  93.     {
  94.         cout << "空队列,无法遍历!" << endl;
  95.         return;
  96.     }
  97.     if (end == 0)
  98.     {
  99.         int i = left;
  100.         while (i != right)
  101.         {
  102.             cout << setw(4) << base[i];
  103.             i = (i + 1) % MAX;
  104.         }
  105.     }
  106.     else
  107.     {
  108.         int i = right;
  109.         while (i != left)
  110.         {
  111.             i = (i - 1 + MAX) % MAX;
  112.             cout << setw(4) << base[i];
  113.         }
  114.     }
  115.     cout << endl;
  116. }
  117. void Deque::clear()
  118. {
  119.     left = right = 0;
  120.     size = 0;
  121. }
  122. 主函数和相关方法:
  123. void check(int& end)  //对端号进行检查
  124. {
  125.     while (cin >> end && !(end == 0 || end == 1))
  126.     {
  127.         cout << "端号不对,重新输入:";
  128.     }
  129. }
  130. void input(Deque& deque)  //输入函数
  131. {
  132.     int end;
  133.     cout << "在指定端入队,0左端,1右端:";
  134.     check(end);
  135.     ElemType data;
  136.     cout << "输入数据,输入0结束" << endl;
  137.     while (cin >> data && data)
  138.     {
  139.         deque.pushAt(data, end);
  140.     }
  141. }
  142. void traverse(Deque& deque)   //从指定端遍历
  143. {
  144.     int end;
  145.     cout << "从指定端遍历:";
  146.     check(end);
  147.     deque.print(end);
  148. }
  149. int main()
  150. {
  151.     cout << "******双端队列演练******" << endl;
  152.     Deque deque;
  153.     cout << "新建双端队列" << endl;
  154.     cout << "队列是否为空:";
  155.     deque.empty() ? cout << "Yes!" << endl : cout << "No!" << endl;
  156.     input(deque);
  157.     traverse(deque);
  158.     input(deque);
  159.     traverse(deque);
  160.     ElemType data;
  161.     int end;
  162.     cout << "获取指定定端的头元素:";
  163.     check(end);
  164.     deque.topAt(data, end) ? cout << data << endl : cout << "队空!" << endl;
  165.     cout << "删除指定定端的头元素:";
  166.     check(end);
  167.     deque.popAt(end) ? cout << "删除成功" << endl : cout << "队空!" << endl;
  168.     traverse(deque);
  169.     cout << "清空队列,队列是否为空:";
  170.     deque.clear();
  171.     deque.empty() ? cout << "Yes!" << endl : cout << "No!" << endl;
  172.     system("pause");
  173.     return 0;
  174. }

运行:

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/116325067

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。