采用类的实现方式
数组实现
#include <iostream>
using namespace std;
class Array
{
int *array;//数组
int ArraySize,ArrayLength;//数组大小,数组元素个数
public:
Array(int sz)//进行初始化
{
ArraySize = sz;
ArrayLength = 0;
array = new int[ArraySize];
}
~Array(void)
{
delete[] array;
}
int GetLength(void)//得到数组的长度
{
return ArrayLength;
}
int Getnode(int i)//取数组第i个结点
{
return (i < 0 || i >= ArrayLength) ? NULL : array[i];
}
int find(int &x)//查找结点
{
for(int i = 0; i < ArrayLength; i++)
{
if(array[i] == x)
{
return i;
}
}
return -1;
}
bool insert(int x, int i)//插入结点
{
if(ArrayLength == ArraySize || i < 0 || i > ArrayLength)
{
return false;
}
else
{
for(int j = ArrayLength - 1; j >= i; j--)
{
array[j+1] = array[j];
}
array[i] = x;
ArrayLength++;
return true;
}
}
bool Remove(int i)//删除第i位元素
{
if(ArrayLength == 0 || i < 0 || i > ArrayLength - 1)
{
return false;
}
else
{
for(int j = i; j < ArrayLength - 1; j++)
{
array[j] = array[j + 1];
}
ArrayLength--;
return true;
}
}
};
int main()
{
Array s1(100);
s1.insert(6,0);
cout << s1.Getnode(0);
return 0;
}
利用数组实现并运算和交运算
并运算
//如果要用模板T的方式 加上模板即可
void Union(Array &Va, Array &Vb)
{
//把数组Vb合并成一个数组
int n = Va.GetLength();
int m = Vb.GetLength();
for(int i = 0; i < m; i++)
{
int x = Vb.Getnode(i); // 从Vb中取一个元素
int k = Va.find(x);// 从Va中查找同值元素
if (k == -1)
{
Va.insert(x,n);//插到Va的最后
n++;
}
}
}
int main()
{
Array s1(100);
Array s2(100);
for(int i = 0; i < 6; i++)
{
s1.insert(i,i);
}
for(int j = 0; j < 5; j++)
{
s2.insert(2+j,j);
}
Union(s1,s2);
for(int i = 0; i < s1.GetLength(); i++)
{
cout << s1.Getnode(i) << " ";
}
return 0;
}
在前面的基础上修改main函数和添加void函数即可。
交运算
void Intersection(Array &Va, Array &Vb)
{
//求Va和Vb中相同的元素,并存入Vb
int n = Va.GetLength();
int m = Vb.GetLength();
int i = 0;
while(i < m)
{
int x = Vb.Getnode(i);//从Vb中取元素
int k = Va.find(x);//在Va中查找同值元素
if(k == -1)//找到则保留该元素,否则Vb中删去该元素
{
Vb.Remove(i);
m--;
}
else
{
i++;
}
}
}
int main()
{
Array s1(100);
Array s2(100);
for(int i = 0; i < 6; i++)
{
s1.insert(i,i);
}
for(int j = 0; j < 5; j++)
{
s2.insert(2+j,j);
}
Intersection(s1,s2);
for(int i = 0; i < s2.GetLength(); i++)
{
cout << s2.Getnode(i) << " ";
}
return 0;
}
对约瑟夫问题求解,将n个人存入一个数组P中,出列则将该元素删除。
约瑟夫问题
void JosePhus(Array P, int n, int s, int m)//n个人围成一圈,从第s人开始报数,报到m出列
{
//人员编号加入数组P中
int k = 1;
for(int i = 0; i < n; i++)
{
P.insert(k,i);
k++;
}
int s1 = s;
for(int j = n; j >= 1; j--)
{
s1 = (s1 + m - 1) % j;//找到要删除的结点
if(s1 == 0)
{
s1 = j;
}
int w = P.Getnode(s1 - 1);
P.Remove(s1 - 1);
P.insert(w,n-1);//把出列的人放在队伍的最后,所有元素都删除一次后则P存放的就是报数出列的人员顺序
}
}