STL初步——栈Stack

『写在前面的一些基础语法』

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;
}

『感悟』

我可能不适合学算法

猜你喜欢

转载自blog.csdn.net/sinat_40872274/article/details/81172263