一:题目

  1. 对于一个以集合为元素的栈,初始时栈为空。
  2.  
  3. 输入的命令有如下几种:
  4.  
  5. PUSH:将空集{}压栈
  6.  
  7. DUP:将栈顶元素复制一份压入栈中
  8.  
  9. UNION:先进行两次弹栈,将获得的集合AB取并集,将结果压栈
  10.  
  11. INTERSECTION:先进行两次弹栈,将获得的集合AB取交集,将结果压栈
  12.  
  13. ADD:先进行两次弹栈,将获得的集合AB中,先出栈的集合(如A先)加入到后出栈的集合,将结果压栈
  14.  
  15. 输出每一步操作后栈顶集合的元素的个数。

(一)样例输入

  1.  
  2. PUSH
  3. DUP
  4. ADD
  5. PUSH
  6. ADD
  7. DUP
  8. ADD
  9. DUP
  10. UNION
  11.  
  12. PUSH
  13. PUSH
  14. ADD
  15. PUSH
  16. INTERSECT

(二)样例输出

  1.  
  2. ***
  3.  
  4. ***

二:代码实现

(一)知识前提STL补充--set集合相等判断

(二)代码实现

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <map>
  4. #include <vector>
  5. #include <set>
  6. #include <stack>
  7. #include <string>
  8. #include <algorithm>
  9.  
  10. using namespace std;
  11.  
  12. typedef set<int> Set;
  13.  
  14. vector<Set> Vec_Set_ID; //辅助获取集合对应ID号,其中每次只往里面添加新的集合
  15. map<Set, int> Map_Set; //集合对应集合标识号,同上面vector,向其中添加新的集合和集合号
  16. stack<int> Sta; //集合号栈
  17. int GetIDForSet(Set s)
  18. {
  19. int number;
  20. if (Map_Set.count(s)) //如果直接找到了编号,则直接返回集合编号
  21. return Map_Set[s];
  22. //若是没有找到集合标号,先将该集合放入容器中之后获取编号
  23. Vec_Set_ID.push_back(s);
  24. number = Vec_Set_ID.size() - 1; //重点:每个集合和其对应的编号与下标一致,方便寻找
  25. Map_Set.insert(pair<Set, int>(s, number));
  26. return number;
  27. }
  28. int main()
  29. {
  30. freopen("data5_5.in", "r", stdin);
  31. freopen("data5_5.out", "w", stdout);
  32.  
  33. int count,oper_c;
  34. string cmd;
  35. cin >> count;
  36. while (count--)
  37. {
  38. cin >> oper_c;
  39. while (oper_c--)
  40. {
  41. cin >> cmd;
  42. //开始处理
  43. if (cmd[] == 'P') //入空集合
  44. Sta.push(GetIDForSet(Set()));
  45. else if (cmd[] == 'D') //栈顶集合复制一份入栈
  46. Sta.push(Sta.top());
  47. else
  48. {
  49. Set s;
  50. Set s1 = Vec_Set_ID[Sta.top()]; Sta.pop();
  51. Set s2 = Vec_Set_ID[Sta.top()]; Sta.pop();
  52. if (cmd[] == 'U') //出栈两个集合将其并集入栈
  53. set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s, s.begin()));
  54. else if (cmd[] == 'I')
  55. set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s, s.begin()));
  56. else if (cmd[] == 'A')
  57. {
  58. s2.insert(GetIDForSet(s1));
  59. s = s2;
  60. }
  61. //进行插入栈中
  62. Sta.push(GetIDForSet(s));
  63. }
  64. //输出每一步栈顶集合的大小
  65. cout << Vec_Set_ID[Sta.top()].size() << endl;
  66. }
  67. cout << "***" << endl;
  68. }
  69.  
  70. freopen("CON", "r", stdin);
  71. freopen("CON", "w", stdout);
  72. return ;
  73. }

算法习题---5.5集合栈计算机(Uva12096)*****的更多相关文章

  1. 集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096)

    集合栈计算机(The SetStack Computer, ACM/ICPC NWERC 2006,Uva12096) 题目描述 有一个专门为了集合运算而设计的"集合栈"计算机.该 ...

  2. UVA12096 集合栈计算机(map和vector实现双射关系+集合的交并运算的STL)

    题目大意: 对于一个以集合为元素的栈,初始时栈为空. 输入的命令有如下几种: PUSH:将空集{}压栈 DUP:将栈顶元素复制一份压入栈中 UNION:先进行两次弹栈,将获得的集合A和B取并集,将结果 ...

  3. 5_5 集合栈计算机(UVa12096)<stack与STL其他容器的综合运用>

    有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始化为空的栈,并支持以下操作:( 维护 N(1≤N≤2000) 个操作, 可能的五种操作如下:) ■PUSH: 在栈顶加入一个空集合 A= ...

  4. stack 集合栈计算机 (摘)

    有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两者的并集入 ...

  5. UVa - 12096 集合栈计算机(STL)

    [题意] 有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两 ...

  6. 集合栈计算机(UVa12096)

    题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...

  7. 集合栈计算机 (The SetStack Computer,ACM/ICPC NWERC 2006,UVa12096

    题目描述: #include<iostream> #include<string> #include<set> #include<map> #inclu ...

  8. uva 12096 - The SetStack Computer(集合栈)

    例题5-5 集合栈计算机(The Set Stack Computer,ACM/ICPC NWERC 2006,UVa12096) 有一个专门为了集合运算而设计的"集合栈"计算机. ...

  9. C语言算法系列---1.队列和栈

    写在前面:在家玩了好久,实在是不知道干嘛了,突然想找些事做,现在是时候做些什么了.这些东西不见得多高深,也可能很简单,但很基础,也无法忽视.同时,也是自己学习走过的一条路. 这是开头,就写写C的队列和 ...

随机推荐

  1. jemeter 查看结果树 分析

    查看结果树,可以看到测试通过,通过 的测试通常为绿色.红色则代表失败了.可以查看到取样器结果,请求,响应数据 取样器结果中可以查看到响应头,响应数据大小,响应时间等信息. Thread Name: 线 ...

  2. test20190803 夏令营NOIP训练19

    60+100+0=160 贪婪大陆 面对蚂蚁们的疯狂进攻,小FF的Tower defence宣告失败--人类被蚂蚁们逼到了Greed Island上的一个海湾.现在,小FF的后方是一望无际的大海, 前 ...

  3. unsupervised learning: K-means 算法

    k-means算法是目前最流行的,用得最多的一种clustering算法 K-means算法 如果我们想要将上图中的绿色的点分为两类,首先随机的选取两个cluster centroids(聚类中心), ...

  4. [Flutter] Custom a Slider with SliderTheme

    SliderTheme( data: SliderTheme.of(context).copyWith( activeTrackColor: Colors.white, inactiveTrackCo ...

  5. asp.net MVC 使用wifidog 协议实现wifi认证

    在网上看到的很多实现的wifidog 协议一般都是PHP 的,了解一下PHP 但是比较喜欢.net ,所以实现了简单的一个进行登录认证的功能 (好多协议中的功能目前没有实现) 1. 开发环境(vs20 ...

  6. AtCoder Grand Contest 010题解

    传送门 \(A\) 判一下奇数的个数就行了 const int N=1e5+5; int a[N],n,res; int main(){ scanf("%d",&n); f ...

  7. Three.js中的div标签跟随(模型弹框)

    目录 Three.js中的div标签跟随(模型弹框) 参考官方案例 核心渲染器 用法 注意事项 Three.js中的div标签跟随(模型弹框) 参考官方案例 核心渲染器 three.js-master ...

  8. TCP的几个知识点

    1. 三次握手.四次挥手 详细查看:https://www.cnblogs.com/amiezhang/p/6703390.html 2. ARQ 协议 ARQ 就是超时重传机制,分为 2 种:停止等 ...

  9. 用vue做的购物车结算的功能

    <!-- 占位 --> <template> <div> <div class="product_table"> <div c ...

  10. css,js 学习记录

    记录一些自己曾经阅读,值得收藏的网址 --(css3新特性) https://segmentfault.com/a/1190000010780991#articleHeader41 --CSS3 3D ...