c++STL 資料結構之stack棧應用
規則: 先入後出!!!!
1.stack基本用法:
定義stack 物件的示例程式碼如下:
stack<int> s1;
stack<string> s2;
stack<int> p[10];
stack 的基本操作有:
入棧,如例:s.push(x);
出棧,如例:s.pop();注意,出棧操作只是刪除棧頂元素,並不返回該元素。
訪問棧頂,如例:s.top()
判斷棧空,如例:s.empty(),當棧空時,返回true。
訪問棧中的元素個數,如例:s.size()。
2.
題目大意:
對於一個以集合為元素的棧,初始時棧為空。
輸入的命令有如下幾種:
PUSH:將空集{}壓棧
DUP:將棧頂元素複製一份壓入棧中
UNION:先進行兩次彈棧,將獲得的集合A和B取並集,將結果壓棧
INTERSECTION:先進行兩次彈棧,將獲得的集合A和B取交集,將結果壓棧
ADD:先進行兩次彈棧,將獲得的集合A和B中,先出棧的集合(如A先)加入到後出棧的集合,將結果壓棧
輸出每一步操作後棧頂集合的元素的個數
Sample Input
2 9 PUSH DUP ADD PUSH ADD DUP ADD DUP UNION 5 PUSH PUSH ADD PUSH INTERSECT
Sample Output
0
0
1
0
1
1
2
2
2
***
0
0
1
0
0
***
——————————————————————————————————————————————————
思路:首先對於集合的集合單純用容器不好表示無法模擬,但可以給每個集合一個ID,將ID存入大集合就實現了集合的集合
<1>對於每個小集合,元素唯一,用set<int>來儲存小集合元素
<2>對於小集合要給予ID,建立對映關係,採取map<set,int>來建立set->ID
<3>對於所有的小集合,採取vector<set>來儲存所有小集合
<4>對於模擬棧操作,用stack<int>才儲存ID模擬操作,最後輸出vector[stack.top()].size()表示元素個數嚶嚶嚶
注意:這裡用到集合的四種演算法,求交集並集等演算法,下節講述,方便快捷!
程式碼:
#include <iostream>
#include<vector>
#include<map>
#include<set>
#include<string>
#include<stack>
#include<algorithm>
using namespace std;
#define ALL(x) x.begin(),x.end()//很迷的巨集定義,先看作函式
#define INS(x) inserter(x,x.begin())
typedef set<int> Set;//set小集合
map<Set,int> IDcache;//集合與ID對映
vector<Set> setcache;//按照ID儲存集合在大集合
int ID(Set x)//尋找集合ID,有則返回ID,沒有建立一個ID並返回
{
if(IDcache.count(x))return IDcache[x];
setcache.push_back(x);
return IDcache[x]=setcache.size()-1;
}
int main()
{
int n,N;
cin>>N;
while(N--)
{
stack<int> s;//定義棧
cin>>n;
while(!s.empty())s.pop();//清空
setcache.clear();
IDcache.clear();
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 x3;
Set x1=setcache[s.top()];//先取出頂部兩集合(s.top()是集合ID,然後拿著ID在vector裡面尋找集合)
s.pop();
Set x2=setcache[s.top()];
s.pop();
if(op[0]=='U')//並集壓入
set_union(ALL(x1),ALL(x2),INS(x3));
else if(op[0]=='I')//交集壓入
set_intersection(ALL(x1),ALL(x2),INS(x3));
else if(op[0]=='A')//先出集合插入後出集合壓入
{
x3=x2;
x3.insert(ID(x1));//把ID插入X3即可,代表插入一個元素(元素是集合而已)
}
s.push(ID(x3));//結果入棧
}
cout<<setcache[s.top()].size()<<endl;
}
cout<<"***"<<endl;
}
return 0;
}
相關推薦
c++STL 資料結構之stack棧應用
規則: 先入後出!!!! 1.stack基本用法: 定義stack 物件的示例程式碼如下: stack<int> s1; stack<string> s2; stack<int> p[10]; stack 的基本操作有: 入棧,如例:
c++STL 資料結構之queue佇列應用
規則: 先進先出!!!1.queue 的基本操作有:入隊,如例:q.push(x); 將x 接到佇列的末端。出隊,如例:q.pop(); 彈出佇列的第一個元素,注意,並不會返回被彈出元素的值。訪問隊首元素,如例:q.front(),即最早被壓入佇列的元素。訪問隊尾元素,如例:
C語言資料結構之棧與佇列的應用(2)
輸入一個表示式,表示式中包括三種括號“()”、“[]”和“{}”,判斷該表示式的括號是否匹配。 #include<stdio.h> #include<stdlib.h> #de
C語言資料結構之圖的鄰接矩陣的應用例項
圖的儲存結構有 3 種形式:鄰接矩陣、鄰接表 和 鄰接多重表 對於一個有 n 個頂點的圖,其頂點資訊可以用一個一維陣列表示,而頂點間是否有相鄰的關係,可以用鄰接矩陣(Adjacency Matrix)來表示。若 G 是一個有 n 個頂點的圖,則 G 的鄰接矩陣 A 是具有如
簡單資料結構之 vector 棧(C++ vector 實現)
/* ============================================================================ Name : stack_array.cpp Author : ntsk13 [em
c語言資料結構之順序表
c語言資料結構之順序表: 順序表的結構跟陣列比起來還是很像的,相比於連結串列,資料表的優勢主要體現在他的查詢速度上,而連結串列的優勢相反,查詢速度慢,但對於插入一個數據來說還是比較快的 下面我們就來建立一個順序表 1:定義資料型別,我定義的是一個學生的結構體型別,首
Java常用資料結構之Stack&Vector
前言 繼續Java常用資料結構分析之路,這次的主角是Stack和Vector。Vector已經不推薦使用了,可以用ArrayList和LinkedList替代,它的主要特色是執行緒安全,代價自然就是效率。Stack則是擁有先進後出的特性,在特定的環境下能很好的工作。這兩個類相較於List和Map的使用頻率要
資料結構之用棧實現迷宮問題(dfs)
給一個n*n的方格,讓你求從左上角到所給一點的任意一條路徑並輸出 該題用到dfs,以下是對dfs的簡要解析 :詳解請參見 傳送門 dfs是一種用於遍歷或搜尋樹或圖的演算法。 沿著樹的深度遍歷樹的節點,儘可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不
JavaScript資料結構之隊棧互搏
今天稍微停下前進的腳步,來看下隊棧的左右互搏術。 前兩天學習了佇列和棧以後,今天就可以試著來用兩個棧實現佇列的功能 或者 用兩個佇列來實現棧的功能。 資料結構之---棧實現佇列 1. 用兩個棧實現一個佇列 1.1 題目分析 棧是先進後出,佇列是先進先出,但可以用兩個棧來模擬一個佇列的功能,來實現
C語言資料結構之連結串列
目錄 1.什麼是連結串列 連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。
資料結構之 --- 樹的應用(並查集)
概念: 並查集是一種簡單的集合表示,它支援一下三種操作: 1)Union(S, Root1, Root2): 把集合S中的子集合Root2併入集合Root1中。要求Root1和Root2互不相交,否則不執行合併。 2)Find(S, x): 查詢集合S中單
C語言資料結構之靜態連結串列實現(A-B)U(B-A)
時間複雜度O(3n)不是很難,直接貼程式碼:StaticLinkList.h#ifndef _STATIC_LINK_LIST_H_ #define _STATIC_LINK_LIST_H_ #define MAXSIZE 100 typedef enum {ERROR,OK
C語言資料結構之稀疏矩陣(一)
最近開始學習C語言的稀疏矩陣的一些知識,現在簡單的整理梳理一下知識脈絡,僅供自己總結學習,歡迎技術指正,拒絕盲噴。 1.首先先介紹一下關於稀疏矩陣的一些基礎知識,關於稀疏矩陣,一直都沒有過很清楚詳細的定義。簡單的說,在M*N的一個矩陣中,假設有t個元素不為0,那麼有計算公
C語言資料結構之線性表的基本操作
線性表的基本操作 內容: (1)順序表的操作 輸入一組整型元素序列,建立線性表的順序儲存結構。實現該線性表的遍歷。在該順序表中查詢某一元素,查詢成功顯示查詢元素,否則顯示查詢失敗。在該順序表中刪除或插入指定元素。 建立兩個按值遞增有序的順序表,將他們合併成一個按值遞增有序的
C++儲存資料結構之四map
Map是c++的一個標準容器,它提供了很好一對一的關係,在一些程式中建立一個map可以起到事半功倍的效果,總結了一些map基本簡單實用的操作! 1. map建構函式; map<string , int >mapstring; map<int ,string
c語言資料結構之順序線性表的合併、並集
//#include "list_test.c" //#include "link_list_test.c" #include "List.h" #include "LinkList.h" #include "utils.c" void MergeList(const Lis
基於C/C++語言資料結構之線性表(一)
資料結構學習筆記: 資料結構的重要性:資料結構我感覺很重要,不僅僅是考試很重要,而且在以後程式設計師事業上都是尤為重要的,知乎上有網友評價資料結構是最重要的程式設計基本能力,沒有之一。我感覺這個說法很對,並且大家都知道,資料結構與演算法這種說法常常被大家使用,就是因為資料
資料結構之棧(Stack)的關於C語言的實現
C語言實現棧共有兩種方法,一種是使用陣列的包含最大Size的棧,另外一種是運用連結串列的方法實現 關於陣列方法實現的程式碼如下: #include<stdio.h> /** * Your MinStack struct will be instantiate
C資料結構之棧的應用:括號匹配和簡單計算器
堆疊是一種資料項按序排列的資料結構,只能在其一端進行插入和刪除。括號匹配和表示式求值是堆疊的兩個典型應用。1.找到無法匹配的左右括號,輸出原字串,失配的左括號下打&,右括號下打? 輸入包括多組資料,每組資料一行,包含一個字串,只包含左右括號和大小寫字母,字元長度不超過
資料結構之C++STL庫
使用STL實現迭代器 #include<iostream> #include<vector> using namespace std; void print(vector<int> v) { //從向量開頭順次訪問 vector<int