一:题目

对于一个以集合为元素的栈,初始时栈为空。

输入的命令有如下几种:

PUSH:将空集{}压栈

DUP:将栈顶元素复制一份压入栈中

UNION:先进行两次弹栈,将获得的集合A和B取并集,将结果压栈

INTERSECTION:先进行两次弹栈,将获得的集合A和B取交集,将结果压栈

ADD:先进行两次弹栈,将获得的集合A和B中,先出栈的集合(如A先)加入到后出栈的集合,将结果压栈

输出每一步操作后栈顶集合的元素的个数。

(一)样例输入


PUSH
DUP
ADD
PUSH
ADD
DUP
ADD
DUP
UNION PUSH
PUSH
ADD
PUSH
INTERSECT

(二)样例输出


***

***

二:代码实现

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

(二)代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <map>
#include <vector>
#include <set>
#include <stack>
#include <string>
#include <algorithm> using namespace std; typedef set<int> Set; vector<Set> Vec_Set_ID; //辅助获取集合对应ID号,其中每次只往里面添加新的集合
map<Set, int> Map_Set; //集合对应集合标识号,同上面vector,向其中添加新的集合和集合号 stack<int> Sta; //集合号栈 int GetIDForSet(Set s)
{
int number;
if (Map_Set.count(s)) //如果直接找到了编号,则直接返回集合编号
return Map_Set[s];
//若是没有找到集合标号,先将该集合放入容器中之后获取编号
Vec_Set_ID.push_back(s);
number = Vec_Set_ID.size() - 1; //重点:每个集合和其对应的编号与下标一致,方便寻找
Map_Set.insert(pair<Set, int>(s, number));
return number;
}
int main()
{
freopen("data5_5.in", "r", stdin);
freopen("data5_5.out", "w", stdout); int count,oper_c;
string cmd;
cin >> count;
while (count--)
{
cin >> oper_c;
while (oper_c--)
{
cin >> cmd;
//开始处理
if (cmd[] == 'P') //入空集合
Sta.push(GetIDForSet(Set()));
else if (cmd[] == 'D') //栈顶集合复制一份入栈
Sta.push(Sta.top());
else
{
Set s;
Set s1
= Vec_Set_ID[Sta.top()]; Sta.pop();
Set s2 = Vec_Set_ID[Sta.top()]; Sta.pop();
if (cmd[] == 'U') //出栈两个集合将其并集入栈
set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s, s.begin()));
else if (cmd[] == 'I')
set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(s, s.begin()));
else if (cmd[] == 'A')
{
s2.insert(GetIDForSet(s1));
s
= s2;
}
//进行插入栈中
Sta.push(GetIDForSet(s));
}
//输出每一步栈顶集合的大小
cout << Vec_Set_ID[Sta.top()].size() << endl;
}
cout << "***" << endl;
} freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
return ;
}

算法习题---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. unsupervised learning: clustering介绍

    unsupervised learning 上面是监督学习与无监督学习的比较,监督学习的training set是一组带label(y)的训练集,而无监督学习不带有label(y). 上图中的监督学习 ...

  2. .net框架-数组

    .net框架所有数组均隐藏继承自System.Array. 数组有维数(Rank),长度(Length),元素类型(Element Type)基本属性. 数组基类System.Array: Array ...

  3. SQL 语句中关于 NULL 的那些坑

    问题描述 今天在跟进公司内部测试平台线上问题的时候,发现一个忽略已久的问题. 为了简化问题描述,将其进行了抽象. 有一张数据表qms_branch,里面包含了一批形式如下所示的数据: id name ...

  4. Java四种读取和创建XML文档的例子教程

    四种方法解析XML文档:Dom.SAX.JDOM.dom4j          1.了解XML XML,即可扩展标记语言(Extensible Markup Language),标准通用标记语言的子集 ...

  5. mini_frame(web框架)

    文件目录: dynamic中:框架 static:css,jss静态文件 teplates:模板 web_server.conf: 配置文件 web_server.py: 主程序 run.sh:运行脚 ...

  6. TPC-H 下载参考

    CSDN免费下载地址 tpc-h-v2.17.3.zip tools https://download.csdn.net/download/zes2014/10558251

  7. 鼠标常用样式(cursor)

    <body> <div>常用的鼠标样式(cursor):pointer,move,defalt,text(火狐不支持hand)</div> </body> ...

  8. RookeyFrame 字典 新增和绑定

    原文:https://www.cnblogs.com/rookey/p/10856657.html 注意: 数据字典 -> 新增 把“是否生效”勾上 是否生效都要勾上哦 !!! 应该自动勾上才对 ...

  9. C 利用移位运算符 把十进制转换成二进制

    #include <stdio.h> int main(void){ //利用移位运算符 把十进制转换成二进制 int c; printf("输入数字:");//8 s ...

  10. SSH如何使用

    如何查看SSH服务是否已经安装? 在终端命令行执行 rpm -qa | grep "ssh" 执行结果请看下图,说明已经安装:其实在安装linux操作系统的时候默认就会安装上的. ...