一:题目

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

输入的命令有如下几种:

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. 1209 BBS 登录

    目录 上周内容 今日内容 url.py views.py login home.html 逻辑流程 登录功能 上周内容 bbs项目 项目开发流程 需求分析 架构设计 分组开发 我们一般情况下都只是作用 ...

  2. 201671030116 宋菲菲 实验十四 团队项目评审&课程学习总结

    项目 内容 作业所属课程 所属课程 作业要求 作业要求 课程学习目标 (1)掌握软件项目评审会流程:(2)反思总结课程学习内容 任务一:团队项目审核已完成.项目验收过程意见表已上交. 任务二:课程学习 ...

  3. CF600E Lomsat gelral 和 CF741D Dokhtar-kosh paths

    Lomsat gelral 一棵以\(1\)为根的树有\(n\)个结点,每个结点都有一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号(若有数量一样的,则求编号和). \(n \le 10^ ...

  4. 接口测试工具soapUI

    一.下载 官网:https://www.soapui.org/ 链接:https://pan.baidu.com/s/15LITTKIvfIoAq5IBpID8gA 提取码:l7p6 二.SoapUI ...

  5. docker 进程 转载:

    今天我们会分析Docker中进程管理的一些细节,并介绍一些常见问题的解决方法和注意事项. 容器的PID namespace(名空间) 在Docker中,进程管理的基础就是Linux内核中的PID名空间 ...

  6. c语言1博客作业08

    一.本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 http://edu.cnblogs.com/campus/zswxy/SE2019-3/homework/9982 我在 ...

  7. Homebrew 更新慢问题

    cd "$(brew --repo)" git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/hom ...

  8. ping命令传递信息

    IP: # 适用于 eth0 inet addr: IP的情况 ping `ifconfig eth0|grep 'inet '|awk '{ print $2}'|awk -F: '{print $ ...

  9. matlab之数组反序输出

    a=[1 2 3 4 5] a(end:-1:1)=[5 4 3 2 1]

  10. Linux - 简单设置 vim (tab, 行号, 换行)

    # 进行这两步操作 cd /etc/ vim vimrc ## 将下面的设置直接添加到 vimrc 中 1. 设置 tab 四个空格:set tabstop=4 2. 显示行好set nu 3. 将下 ...