集合棧計算機 詳細解答 UVa12096

2021-10-22 07:24:57 字數 2071 閱讀 9731

題目:

有乙個專門為了集合運算而設計的「集合棧」計算機。該機器有乙個初始為空的棧,並且支援以下操作:

push:空集「{}」入棧

dup:把當前棧頂元素複製乙份後再入棧

union:出棧兩個集合,然後把兩者的並集入棧

intersect:出棧兩個集合,然後把二者的交集入棧

add:出棧兩個集合,然後把先出棧的集合加入到後出棧的集合中,把結果入棧

每次操作後,輸出棧頂集合的大小(即元素個數)。例如棧頂元素是a=, } }, 下乙個元素是b=, }} },則:

union操作將得到, }, }} },輸出3.

intersect操作將得到 },輸出1

add操作將得到, }}, , } } },輸出3.

(輸入:先輸入測試次數,再輸入操作次數,再輸入具體操作)

輸入:

9push

dupadd

push

adddup

adddup

union

輸出:00

1011

222

解題思路:

首先注意他這個集合就是stl中的set,然後模擬,根據它的要求進行做就好了,關鍵是需要stl中的一些工具以及對set,map,vector的操作熟練。我把這道題要用的方法寫在下面包括巨集定義。

我在說一下這道題set,map,vector之間的聯絡。

首先定義了新資料型別set,然後map的key值為set,value值為在vector之中的下標,vector中存放set元素,每次新的set元素通過id()方法,將set存到vector,將對應位置存到map的value中。

題中方法:

set_union(a.begin(),a.end(),b.begin(),b.end(),inserter( c1 , c1.begin() ) );前四個引數依次是第一的集合的頭尾,第二個集合的頭尾。第五個引數的意思是將集合a、b取合集後的結果存入集合c中。

set_intersection()裡面引數和set_union()方法相同,只不過這個是求交集。

inserter(x,x.begin),x表示容器,x.begin()表示迭代器。所以inserter()是乙個迭代器返回x.begin()所指向的位置,第二個引數也可以是別的迭代器。

#define all(x) x.begin(),x.end() 名字為all傳入引數x,表示從x的頭到x的尾。

#define ins(x) inserter(x,x.begin()) 名字為ins,代表乙個迭代器,指向x的開頭。

**:(**中有詳細注釋)

#include

#define all(x)x.begin(),x.end()

#define ins(x)inserter(x,x.begin())

using

namespace std;

typedef set<

int> set;

//定義新型別set

mapint> idcache;

//key位set型別,value為set的id

vector setcache;

//存放set集合的陣列,通過下標id找到set

//id()給傳入的set定義編號(id)

intid

(set x)

intmain()

//add,先將x1插入x2存到x,在將x存入棧

s.push(id

(x));}

cout

.size()

<}return0;

}

謝謝**!

創作不易,多多支援!嘻嘻~~~

集合棧計算機

集合棧計算機 題目是這樣的 有乙個專門為了集合運算而設計的 集合棧 計算機。該機器有乙個初始為空的棧,並且支援以下操作 push 空集 入棧 dup 把當前棧頂元素複製乙份後再入棧 union 出棧兩個集合,然後把兩者的並集入棧 intersect 出棧兩個集合,然後把二者的交集入棧 add 出棧兩...

集合棧計算機

有乙個專門為了集合運算而設計的 集合棧 計算機。該機器有乙個初始為空的棧,並且支援以下操作 push 空集 入棧 dup 把當前棧頂元素複製乙份後再入棧 union 出棧兩個集合,然後把兩者的並集入棧 intersect 出棧兩個集合,然後把二者的交集入棧 add 出棧兩個集合,然後把先出棧的集合加...

集合棧計算機

有乙個專門為了集合運算而設計的 集合棧 計算機。該機器有乙個初始化為空的棧,並且支援以下操作。每次操作後,輸出棧頂集合的大小 即元素的個數 分析 這裡的集合並不是簡單整數集合或者字元集合,而是集合的集合。為了方便起見,此處為每個不同的集合分配乙個唯一的id,則每個集合都可以表示成所包含元素的id集合...