UVA 12096 集合栈计算机
题目描述
有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个初始为空的栈,并且
支持以下操作。
PUSH:空集“{}”入栈。
DUP:把当前栈顶元素复制一份后再入栈。
UNION:出栈两个集合,然后把二者的并集入栈。
INTERSECT:出栈两个集合,然后把二者的交集入栈。
ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈。
每次操作后,输出栈顶集合的大小(即元素个数)。
知识补充:C++ stack
stack一个先进先出的堆栈
常用方法 empty pop push size top
empty() 堆栈为空则返回真
pop() 移除栈顶元素
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素
代码实现
//摘自刘汝佳
#include
#inlcude
#include
#include
#include
typedef set Set;
map idache;
vector setcache;
#define all(x) x.begin(),x.end();
#define ins(x) inserter(x,x.begin())
int id(set x){
if(idache.count(x))
return idache[x];
setcache.push_back(x);
return idache[x]=setcache.size()-1;
}
stack s;
int n;
cin>>n;
for(int i=0;i
string op;
cin>>op;
if(op[0]=='p')
s.push(id(set()));
if(op[0]=='D')
s.push(s.top());
else
{
set x1=setcache[s.top()];
s.pop();
set x2=setcache[s.top()];
s.pop();
set x;
if (op[0] == 'U') set_union (ALL(x1), ALL(x2), INS(x));
if (op[0] == 'I') set_intersection (ALL(x1), ALL(x2), INS(x));
if (op[0] == 'A') { x = x2; x.insert(ID(x1)); }
s.push(ID(x));
}
cout<
}
by制杖菜鸡