1. 程式人生 > >c++STL 資料結構之stack棧應用

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