『写在前面的一些基础语法』
1.栈(stack)的一些特性
- 操作原则:后进先出(Last In First Out ,LIFO)。
- 仅允许在表的一端进行插入和删除运算的线性表。
- 允许运算的一端被称为栈顶(Top),相对地,把另一端称为栈底(Bottom)。
2.定义 和 赋值
- stack<int> s;
- stack<int> s1(s2); //复制栈
3.一些基础的操作
- s.push(x);//压入一个数据到栈中
- s.pop()l//弹出栈顶数据
- s.top();//返回栈顶的元素,但不弹出
- s.empty();//判断栈是否为空
- s.size();//返回栈中的元素个数
『上题上题』
【集合栈计算机】
有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个初始为空的栈,并且支持以下操作:
- PUSH:空集“{}”入栈
- DUP:把当前栈顶元素复制一份后再入栈。
- UNION:出栈两个集合,然后把两者的并集入栈。
- INTERSECT:出栈两个集合,然后把二者的交集入栈。
- ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈
每次操作后,输出栈顶集合的大小(即元素个数)。例如栈顶元素是A={ {}, {{}} }, 下一个元素是B={ {}, {{{}}} },则:
- UNION操作将得到{ {}, {{}}, {{{}}} },输出3.
- INTERSECT操作将得到{ {} },输出1
- ADD操作将得到{ {}, {{{}}}, { {}, {{}} } },输出3.
输入不超过2000个操作,并且保证操作均能顺利进行(不需要对空栈进行出栈操作)
(输入:先输入测试次数,再输入操作次数,再输入具体操作)
【输入样例】
2
9
PUSH
DUP
ADD
PUSH
ADD
DUP
ADD
DUP
UNION
5
PUSH
PUSH
ADD
PUSH
INTERSECT
【输出样例】
case1:
0
0
1
0
1
1
2
2
2
case2:
0
0
1
0
0
『代码代码』(照着书上抄的)
看了很久的题目,看思路是比较简单的一道模拟题,but。。。。实现起来好困难啊 原本打算自己写 最后还是抄了答案,orz。。。
#include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <stack>
using namespace std;
#define ALL(x) x.begin(),x.end() //所有的内容
#define INS(x) inserter(x,x.begin()) //插入迭代器
typedef set<int> Set;
map<Set, int> IDcache; //把集合映射成ID
vector<Set> Setcache; //根据ID取集合
vector<int> ans;
//查找给定集合x的ID,如果找不到,则分配一个新ID
int ID(Set x) {
if(IDcache.count(x))
return IDcache[x];
Setcache.push_back(x); //添加新集合
return IDcache[x] = Setcache.size() - 1;
}
int main() {
int kase;
cin>>kase;
while(kase--) {
stack<int> s;//题目中的栈
int n;
cin>>n;
for(int i = 0; i < n; i++) {
string op;
cin>>op;
if(op[0] == 'P')
s.push(ID(Set()));//
else 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));
}
ans.push_back(Setcache[s.top()].size());
}
}
vector<int>::iterator it;
for(it=ans.begin(); it != ans.end();it++)
cout<<*it<<endl;
return 0;
}
『感悟』
我可能不适合学算法