C++stl中的双向队列

ゝ一世哀愁。 2022-05-18 06:15 357阅读 0赞

deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque在接口上和vector非常相似,0_1320717883Pm54.gif

deque的实现比较复杂,内部会维护一个map(注意!不是STL中的map容器)即一小块连续的空间,该空间中每个元素都是指针,指向另一段(较大的)区域,这个区域称为缓冲区,缓冲区用来保存deque中的数据。因此deque在随机访问和遍历数据会比vector慢。具体的deque实现可以参考《STL源码剖析》,当然此书中使用的SGI STL与VS2008所使用的PJ STL的实现方法还是有区别的。下面给出了deque的结构图:

0_13207172099IU6.gif

由于篇幅问题,deque的实现细节就不再深入了,下面给出deque的使用范例:

  1. //双向队列 deque
  2. //by MoreWindows http://blog.csdn.net/morewindows
  3. #include <deque>
  4. #include <cstdio>
  5. #include <algorithm>
  6. using namespace std;
  7. int main()
  8. {
  9. deque<int> ideq(20); //Create a deque ideq with 20 elements of default value 0
  10. deque<int>::iterator pos;
  11. int i;
  12. //使用assign()赋值 assign在计算机中就是赋值的意思
  13. for (i = 0; i < 20; ++i)
  14. ideq[i] = i;
  15. //输出deque
  16. printf("输出deque中数据:\n");
  17. for (i = 0; i < 20; ++i)
  18. printf("%d ", ideq[i]);
  19. putchar('\n');
  20. //在头尾加入新数据
  21. printf("\n在头尾加入新数据...\n");
  22. ideq.push_back(100);
  23. ideq.push_front(i);
  24. //输出deque
  25. printf("\n输出deque中数据:\n");
  26. for (pos = ideq.begin(); pos != ideq.end(); pos++)
  27. printf("%d ", *pos);
  28. putchar('\n');
  29. //查找
  30. const int FINDNUMBER = 19;
  31. printf("\n查找%d\n", FINDNUMBER);
  32. pos = find(ideq.begin(), ideq.end(), FINDNUMBER);
  33. if (pos != ideq.end())
  34. printf("find %d success\n", *pos);
  35. else
  36. printf("find failed\n");
  37. //在头尾删除数据
  38. printf("\n在头尾删除数据...\n");
  39. ideq.pop_back();
  40. ideq.pop_front();
  41. //输出deque
  42. printf("\n输出deque中数据:\n");
  43. for (pos = ideq.begin(); pos != ideq.end(); pos++)
  44. printf("%d ", *pos);
  45. putchar('\n');
  46. return 0;
  47. }

运行结果如下:

0_1320717228QV1x.gif

另外要注意一点。对于deque和vector来说,尽量少用erase(pos)和erase(beg,end)。因为这在中间删除数据后会导致后面的数据向前移动,从而使效率低下。

在给出一个实例:

双向队列

Time Limit: 1000MS Memory Limit: 65536KB

Submit Statistic

Problem Description

想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。
现在给你一系列的操作,请输出最后队列的状态;
命令格式:
LIN X X表示一个整数,命令代表左边进队操作;
RIN X 表示右边进队操作;
ROUT
LOUT 表示出队操作;

Input

第一行包含一个整数M(M<=10000),表示有M个操作;
以下M行每行包含一条命令;
命令可能不合法,对于不合法的命令,请在输出中处理;

Output

输出的第一行包含队列进行了M次操作后的状态,从左往右输出,每两个之间用空格隔开;
以下若干行处理不合法的命令(如果存在);
对于不合法的命令,请输出一行X ERROR
其中X表示是第几条命令;

Example Input

  1. 8
  2. LIN 5
  3. RIN 6
  4. LIN 3
  5. LOUT
  6. ROUT
  7. ROUT
  8. ROUT
  9. LIN 3

Example Output

  1. 3
  2. 7 ERROR

代码如下:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. int n;
  6. deque<int>q;
  7. int ss[100001];
  8. int k = 0;
  9. cin>>n;
  10. for(int i = 1; i <= n; i++)
  11. {
  12. char a[10];
  13. scanf("%s",a);
  14. if(strcmp(a,"LIN") == 0)
  15. {
  16. int key;
  17. cin>>key;
  18. q.push_front(key);//在头部插入一个元素;
  19. }
  20. else if(strcmp(a,"RIN") == 0)
  21. {
  22. int key;
  23. cin>>key;
  24. q.push_back(key);//在队列尾部插入一个元素;
  25. }
  26. else if(strcmp(a,"ROUT") == 0)//队列右边出队;
  27. {
  28. if(!q.empty())
  29. q.pop_back();
  30. else
  31. ss[k++] = i;
  32. }
  33. else if(strcmp(a,"LOUT")== 0)//队列左边出队;
  34. {
  35. if(!q.empty())
  36. q.pop_front();
  37. else
  38. ss[k++] = i;
  39. }
  40. else
  41. ss[k++] = i;
  42. }
  43. deque<int>::iterator it;
  44. for(it = q.begin(); it != q.end(); it++)
  45. {
  46. if(it != q.begin())
  47. cout<<" ";
  48. cout<<*it;
  49. }
  50. cout<<endl;
  51. for(int i = 0; i < k; i++)
  52. {
  53. cout<<ss[i]<<" "<<"ERROR"<<endl;
  54. }
  55. return 0;
  56. }

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/6946811

发表评论

表情:
评论列表 (有 0 条评论,357人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++ 双向队列

    deque 也是顺序容器的一种,同时也是一个可变长数组。要使用 deque,需要包含头文件 deque。所有适用于 vector 的操作都适用于 deque。 deque 和

    相关 说说 Python 双向队列

    虽然可以使用 Python 列表的 .append 和 .pop 方法模拟栈或者队列,但删除列表的第一个元素或者在第一个元素之前添加一个新元素,都非常耗时。因为需要把列表中的所

    相关 SDUTACM 双向队列

    题目描述 想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。 现在给你一系列的操作,请输出最后队列的状态;

    相关 双向队列

    Problem Description 想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。 现在给你一系列的操

    相关 双向队列

    说是双向队列的题,用队列还一直没解决,于是用了数组,这里提供两个代码,一个是我的,一个是巨巨的,对比寻找不足。 双向队列