1. 程式人生 > >集合類(並集、交集、差集操作)

集合類(並集、交集、差集操作)

昨日,朋友拿來一份有些問題的原始碼,是一個集合類和幾個集合操作函式(並集、交集、差集),幫忙改了一下,剛轉C++不到半個月,因為只是為了演算法競賽而學C++,所以只好好學了C++偏向演算法層的知識,類只是過了一遍,沒有自己嘗試寫過,剛好拿來練練手,於是大刀闊斧的修改了起來,變動不是太大,都是細節有所改動(因為他的程式碼細節問題很多),大的體系沒有變。

程式碼C++:

#include <iostream>
#include <string>

using namespace std;

const int MaxSize = 200;

//  集合類模板
template
<class T> class SeqList { public: SeqList() // 無參建構函式 { length = 0; } SeqList(T a, int n) // 帶參建構函式 { if (n > MaxSize) { throw "Error: The number of array elements is not valid in One!"
; // 陣列元素個數不合法 } for (int i = 0; i < n; i++) { data[i] = a[i]; } length = n; // 長度 } SeqList(const SeqList &A) // A中元素的值不變 { for(int i = 0; i < A.length; i++) { data[i] = A.data[i]; } length = A.length; } int
Length() // 求長度 { return length; } char Get(int i) // 獲取下標為i的元素 { return data[i]; } int Locate(T item) // 查詢相同的元素 { for (int i = 0; i <= length; i++) { if (data[i] == item) { return i + 1; } } return 0; } void Insert(int i, char item) // 插入操作 在第i個位置插入一個元素item { int j; if (length >= MaxSize) { throw "Error: Length is not lawful in Two!"; // 長度不合法 } if (i < 1 || i > length + 1) { throw "Error: Place is not valid in Three!"; // 位置不合法 } for (j = length; j >= i; j--) { data[j] = data[j - 1]; } data[i - 1] = item; length++; } T Delete(int i) // 刪除並返回刪除值操作 刪除第i個位置的元素 { int item, j; if (length == 0) { throw "Error: Table is empty, can not delete elements!"; // 表為空,無法刪除元素 } if (i < 1 || i > length) { throw "Error: Place is not valid in Three!"; // 元素位置不合法 } item = data[i - 1]; for (j = i; j < length; j++) { data[j-1]=data[j]; } length--; return item; } void display() // 輸出操作 { for (int i = 0; i < length; i++) { cout << data[i]; } } bool empty() // 判斷是否為空 { if (length == 0) { return true; } return false; } void clear() // 清理 { length = 0; } private: char data[MaxSize]; // 儲存資料的陣列 int length; // 表的長度 }; // 集合的並集集運算 template<class T> SeqList<T> Union(SeqList<T> A, SeqList<T> B) { SeqList<T> C; int m = 1; int a = A.Length(); for (int b = 0; b <= B.Length(); b++) { A.Insert(a + b + 1, B.Get(b)); // 將B的元素插入到A的後面 } for (char i = 'a'; i <= 'z'; i++) { for (int d = 0; d <= A.Length(); d++) { if (A.Get(d) == i) // 將組合後的元素和i比較 { C.Insert(m, i); // 相同則插入 m++; // 不同則繼續 break; } } } for (char u = 'a' - 32; u <= 'z' - 32; u++) { for (int d = 0; d <= A.Length(); d++) { if (A.Get(d) == u) // 將組合後的元素和i比較 { C.Insert(m, u); // 相同則插入 m++; // 不同則繼續 break; } } } return C; } // 集合的交集運算 template<class T> SeqList<T> Toge(SeqList<T> A,SeqList<T> B) { SeqList<T> C; int m = 1; int flag = 0; for (char i = 'a'; i <= 'z'; i++, flag = 0) { for (int a = 0; a <= A.Length(); a++) { if (A.Get(a) == i) // 將i與A中元素進行比較 { for (int b = 0; b <= B.Length(); b++) { if (B.Get(b) == i) // 將i與B中元素進行比較 { C.Insert(m, i); // 若都有i,則將其插入C m++; flag = 1; break; } } if(flag == 1) { break; } } } } for (char u = 'a' - 32; u <= 'z' - 32; u++, flag = 0) { for (int a = 0; a <= A.Length(); a++) { if (A.Get(a) == u) // 將i與A中元素進行比較 { for (int b = 0; b <= B.Length(); b++) { if (B.Get(b) == u) // 將i與B中元素進行比較 { C.Insert(m, u); // 若都有i,則將其插入C m++; flag=1; break; } } if (flag == 1) { break; } } } } return C; } // 集合的差集運算 template<class T> SeqList<T> Subm(SeqList<T> A, SeqList<T> B) { SeqList<T> C; int m = 1; int flag = 0; for (char i = 'a'; i <= 'z'; i++, flag = 0) // 這裡i的範圍如何修改,能夠將大寫的字母也加入範圍中 { for (int a = 0; a <= A.Length(); a++) { if (A.Get(a) == i) // 將i與A中元素進行比較 { for (int b = 0; b <= B.Length(); b++) { if (B.Get(b) == i) // 繼續與B中元素進行比較 { flag = m; } } if (flag == 0) { C.Insert(m, i); m++; break; } } } } for (char u = 'a' - 32; u <= 'z' - 32; u++, flag = 0) // 這裡i的範圍如何修改,能夠將大寫的字母也加入範圍中 { for (int a = 0; a <= A.Length(); a++) { if(A.Get(a) == u) // 將i與A中元素進行比較 { for(int b = 0; b <= B.Length(); b++) { if(B.Get(b) == u) // 繼續與B中元素進行比較 { flag = m; } } if(flag == 0) { C.Insert(m, u); m++; break; } } } } return C; } int main() { string a; string b; cout << "************集合a的元素為************:\n"; getline(cin, a); // 讀取a的輸入,因為輸入中可能有空格,所以不用cin cout << endl; cout << "************集合b的元素為************:\n"; getline(cin, b); // 讀取b的輸入 cout << endl; SeqList<string> A(a, (int)a.length()), B(b, (int)b.length()), C, D, E, F; C = Union(A, B); cout << "集合的並集為:"; C.display(); cout << endl; D = Toge(A, B); cout << "集合的交集為:"; D.display(); cout << endl; E = Subm(B, A); F = Subm(A, B); cout << "集合的差集為:"; E.display(); F.display(); cout << endl; return 0; }

其實像這種非競賽性的程式設計,我是極不願意將名稱空間std直接匯入的,因為這樣子有背名稱空間存在的初衷。然而改一個人的程式碼真的是一個勞神的事情,原始碼的編碼格式規範問題很嚴重,個人又有強迫症,先是花了半個小時將其程式碼規範了一下格式,因為我看著不是太規範的程式碼頭疼……這也許是病吧!

命名規範和我不一樣暫且能忍,畢竟也是一個比較流行且科學的命名規範,編碼格式亂,我就忍不下去了……

相關推薦

集合交集操作

昨日,朋友拿來一份有些問題的原始碼,是一個集合類和幾個集合操作函式(並集、交集、差集),幫忙改了一下,剛轉C++不到半個月,因為只是為了演算法競賽而學C++,所以只好好學了C++偏向演算法層的知識,類只是過了一遍,沒有自己嘗試寫過,剛好拿來練練手,於是大刀闊斧的

php中陣列的交集函式

計算陣列的並集 array_merge ( array array1[,arrayarray1[,array… ] )  將一個或多個數組的單元合併起來,一個數組中的值附加在前一個數組的後面。返回作為結果的陣列。 計算陣列的交集 array_intersect ( a

JS實現交集

交集 clas 差集 log set nio bsp csdn 實現 var set1 = new Set([1,2,3]);var set2 = new Set([2,3,4]); 並集let union = new Set([...set1, ...set2]); 交集

利用sort和uniq求兩個文件的交集

sort uniq  利用sort和uniq求兩個文件的並集,交集和差集  並集:cat file1.txt file2.txt | sort | uniq > file.txt  交集:cat file1.txt file2.txt | sort | uniq -d >file.txt 

shell中使用sort和uniq實現兩檔案的交集

網上轉的,不錯,比使用awk容易點 給定兩個檔案 a.txt 和 b.txt ,每行是一個記錄(假設沒有重複),要求輸出兩集合的交集、並集、差集,輸出的結果只包括唯一項。交集定義為同時出現在兩個檔案中的記錄項,並集定義為出現在任何一個檔案中的記錄項,差集(A-B)定義為出現在A中而且不出現在B中的記

Python listunion, 交集intersection, difference

轉載自翔雲並感謝Share python的集合set和其他語言類似,是一個無序不重複元素集, 可用於消除重複元素。 支援union(聯合), intersection(交), difference(差)和sysmmetric difference(對稱差集)等數學運算。 不支援 inde

JS陣列求交集

es7: filter結合includes // 並集 let union = a.concat(b.filter(v => !a.includes(v))) // [1,2,3,4,5] // 交集 let intersectio

ES6 運算元組的交集

使用ES6 運算元組 let a = new Set([1, 2, 3]); let b = new Set([3, 5, 2]); // 並集 let unionSet = new Set(

PHP陣列的幾個操作,求交集,陣列與字串的相互轉換及陣列去重

在php中如果我想要對兩個陣列進行如並集、交集和差集操作,我們可直接使用php自帶的函式來操作如array_merge(),array_intersect(),array_diff(). 計算陣列的合併 array_merge與“+”的區別 array_merge() 函式

集合運算交集

問題描述   給出兩個整數集合A、B,求出他們的交集、並集以及B在A中的餘集。 輸入格式   第一行為一個整數n,表示集合A中的元素個數。   第二行有n個互不相同的用空格隔開的整數,表示集合A中的元素。   第三行為一個整數m,表示集合B中的元素個數。   第四行有m個

兩個集合的相等判斷交集

#include<iostream> using namespace std; const int Size=10; void Get(int a[]); void Judge(int a[],int b[]);//判斷兩函式是否相等 void Intersaction(int a[],

python求補集合交集

聯合( | ) 聯合(union)操作和集合的 OR(又稱可兼析取(inclusive disjunction))其實是等價的,兩個集合的聯合是一個新集合,該集合中的每個元素都至少是其中一個

STL集合交集對稱

STL一共提供了四種set相關的演算法,分別是並集(union),交集(intersection),差集(difference),和對稱差集(symmetric difference)。 STL的這四個演算法所接受的set必須是有序區間,元素可以重複出現。即他們只能接受se

獲取兩個DataTable之間的交集集合(ExceptIntersectUnion)

//獲取第一個資料來源DataTable         DataTable dt1 = DBHelper.GetDataTable("select top 10  ksdid,user_id,user_pwd from ksd_user_info");      

兩個整數集合A,B,求二者交集

交集: void Intersect(const vector<int>& A,const vector<int>& B,vector<int>& ans) {     map<int, int> Counter;     cons

List的 交集操作

bject list imp st2 for add str class lis package com.zheting.collection.list; import java.util.ArrayList; import java.util.Arrays; impo

SQL 操作結果 -交集結果排序

nbsp 分享 字段名 運算 語法 http 測試數據 結構 put 操作結果集   為了配合測試,特地建了兩個表,並且添加了一些測試數據,其中重復記錄為東吳的人物。   表:Person_1魏國人物       表:Person_2蜀國人物      A、Union形成並

java基礎17集合1:Collection

實例 array 9.png str 列表 println 方式 elements .com 一.  什麽是集合類? 二.  Collection接口   2.1  Collection子接口(List接口和Set接口)   2.1  Collection的常用方法 三. 

ES6陣列實現交集

let set1 = new Set(['a','b','c','d','e','f']); let set2 = new Set(['d','e','f','g','h','i']); //並集 let union = [...new Set([...set1,...set2])]; /

兩個陣列的交集

const arr1 = [1,2,3];const arr2 = [3,4,5];// 並集const union = Array.from(new Set([...arr1,...arr2]));