集合類(並集、交集、差集操作)
昨日,朋友拿來一份有些問題的原始碼,是一個集合類和幾個集合操作函式(並集、交集、差集),幫忙改了一下,剛轉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 list並集union, 交集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之間的差集、交集、並集集合(Except、Intersect、Union)
//獲取第一個資料來源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]));