2 顺序表ADT模板简单应用算法设计:删除顺序表中的冗余元素
问题描述:
目的:使用自行设计的顺序表ADT或STL中的vector模板,设计并实现顺序表应用场合的一些简单算法设计。应用3:试设计一个算法,删除非空顺序表L中的冗余元素,即使得操作之后的顺序表中只保留操作之前表中所有值都不相同的元素(提纯)。
参考函数原型:
(1)顺序表ADT版本
template
void Purge_Sq( Sqlist &L );
(2)vector版本
template
void Purge_Sq( vector &L );
输入说明:
第一行:顺序表的数据元素类型标记(0:int;1:double;2:char;3:string;其余值:输出err)
第二行:待处理顺序表的数据元素(数据元素之间以空格分隔)
输出说明:
第一行:提纯前顺序表的遍历结果(数据元素之间以“,”分隔)
空行
第二行:提纯后顺序表的遍历结果(数据元素之间以“,”分隔)
思路:
由于第一题的缘故,这道题就很简单了,输入的格式都已经有了,需要做的只有删除重复的元素,一开始想的是直接用stl的unique函数处理,但是发现重复的数据不是相邻的而且不能改变这些数的排序,所以只能傻傻的用O(n^2)的遍历去找重复的元素(肯定有更快的方法,所幸给的数据水,a了,换成比赛要出事)
AC代码:
#include<bits/stdc++.h>
using namespace std;
template<class ElemType>
void clearup( vector<ElemType> &a)
{
for(unsigned i=0;i<a.size();i++)
{
for(int j=0;j<i;j++)
{
if(a[i]==a[j])
{
a.erase(a.begin()+i);
i--;
break;
}
}
}
}
int main()
{
int kind;
cin>>kind;
getchar();
if(kind!=0&&kind!=1&&kind!=2&&kind!=3)
{
cout<<"err"<<endl;
return 0;
}
string s;
if(kind==0)
{
getline(cin,s);
vector<int>a;
int num=0;
for (unsigned i=0; i<s.size(); i++)
{
if (s[i]==' ')
{
a.push_back(num);
num=0;
}
else
{
num=num*10+s[i]-'0';
}
}
a.push_back(num);
cout<<a[0];
for(int i=1; i<a.size(); i++)
{
cout<<','<<a[i];
}
cout<<endl<<endl;
clearup(a);
cout<<a[0];
for(int i=1; i<a.size(); i++)
{
cout<<','<<a[i];
}
}
if(kind==1)
{
getline(cin,s);
vector<double>b;
double num=0.0,sum=0.0;
int judge=0,t=0;
for(unsigned i=0; i<s.size(); i++)
{
if(s[i]==' ')
{
num=num/pow(10,t);
b.push_back(num);
num=0.0;
judge=0,t=0;
}
else if(s[i]=='.')
{
judge=1;
}
else
{
num=num*10+s[i]-'0';
if(judge==1)
{
t++;
}
}
}
num=num/pow(10,t);
b.push_back(num);
cout<<b[0];
for(int i=1; i<b.size(); i++)
{
cout<<','<<b[i];
}
cout<<endl<<endl;
clearup(b);
cout<<b[0];
for(int i=1; i<b.size(); i++)
{
cout<<','<<b[i];
}
cout<<endl;
}
if(kind==2)
{
getline(cin,s);
vector<char> c;
char ch;
for(unsigned i=0; i<s.size(); i++)
{
ch=s[i];
if(ch!=' ')
{
c.push_back(ch);
}
}
cout<<c[0];
for(int i=1; i<c.size(); i++)
{
cout<<','<<c[i];
}
cout<<endl<<endl;
clearup(c);
cout<<c[0];
for(int i=1; i<c.size(); i++)
{
cout<<','<<c[i];
}
cout<<endl;
}
if(kind==3)
{
getline(cin,s);
vector<string>d;
string k;
k.clear();
for(unsigned i=0;i<s.size();i++)
{
/*a*/
if(s[i]==' ')
{
d.push_back(k);
k.clear();
}
else
{
k+=s[i];
}
}
d.push_back(k);
cout<<d[0];
for(unsigned i=1;i<d.size();i++)
{
cout<<','<<d[i];
}
cout<<endl<<endl;
clearup(d);
cout<<d[0];
for(unsigned i=1;i<d.size();i++)
{
cout<<','<<d[i];
}
}
return 0;
}