UVA 12096 集合栈计算机

UVA 12096 集合栈计算机

题目描述

有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个初始为空的栈,并且
支持以下操作。

  • PUSH:空集“{}”入栈。

  • DUP:把当前栈顶元素复制一份后再入栈。

  • UNION:出栈两个集合,然后把二者的并集入栈。

  • INTERSECT:出栈两个集合,然后把二者的交集入栈。

  • ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈。
    每次操作后,输出栈顶集合的大小(即元素个数)。


知识补充:C++ stack

  1. stack一个先进先出的堆栈
  2. 常用方法 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>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制杖菜鸡

你可能感兴趣的:(UVA 12096 集合栈计算机)