目录
1.题目
顺序表ADT模板简单应用算法设计:有序顺序表的提纯
作者: 冯向阳 时间限制: 1S 章节: DS:线性表
问题描述 :
目的:使用自行设计的顺序表ADT或STL中的vector模板,设计并实现顺序表应用场合的一些简单算法设计。
应用5:试设计一个算法,删除有序顺序表L中的冗余元素,即使得操作之后的顺序表中只保留操作之前表中所有值都不相同的元素,并保持其有序性。
参考函数原型:
(1)顺序表ADT版本
template<class ElemType>
void Purge_Sq_OL( SqList<ElemType> &L );
(2)vector版本
template<class ElemType>
void Purge_Sq_OL( vector<ElemType> &L );
输入说明 :
第一行:顺序表的数据元素类型标记(0:int;1:double;2:char;3:string;其余值:输出err)
第二行:有序顺序表的数据元素(数据元素之间以空格分隔)
输出说明 :
第一行:提纯前有序顺序表的遍历结果(数据元素之间以“,”分隔)
空行
第二行:提纯后有序顺序表的遍历结果(数据元素之间以“,”分隔)
输入范例 :
0
2 3 3 5 5 5 7 11输出范例 :
2,3,3,5,5,5,7,11
2,3,5,7,11
2.题解
- 读题:实现顺序表+实现有序表去重
- 造表:推荐stringstream,自己用简单语句实现也行
- 有序表去重:第一想法是与第三题思路相似,两重循环去除冗余元素,但是这样时间复杂度是O(n*n)。利用这个顺序表是有序的性质,可以优化算法,就是一重循环遍历表,每个元素只与前一个元素比较,相同删除,不同继续遍历。
3.代码实现
- 造表
#include <iostream> #include <vector> #include <sstream> #include <cstring> using namespace std; int n; string s; template<class T> void dele(stringstream &input,vector<T> &A) { T str; while(input>>str)A.push_back(str); } int main() { cin>>n; getchar(); getline(cin,s); stringstream input(s); if(n==0) { vector<int> a; dele(input,a); } else if(n==1) { vector<double> b; dele(input,b); } else if(n==2) { vector<char> c; dele(input,c); } else if(n==3) { vector<string> d; dele(input,d); } else cout<<"err"<<endl; return 0; }
- 有序表去重
template<class T> void dele(stringstream &input,vector<T> &A) { for(int i=0;i<A.size();i++) { if(i&&A[i]==A[i-1]) { A.erase(A.begin()+i); i--; } } }
- 完整代码(第二个是用stringstream)
#include <iostream> #include <cstdio> #include <vector> #include <algorithm> #include <cstring> using namespace std; int n; string s; template<class T> void print(vector<T> &A) { int i; for(i=0; i<A.size()-1; i++) { cout<<A[i]<<","; } cout<<A[i]<<endl; } template<class T> void change(vector<T> &A) { print(A); cout<<endl; for(int i=0;i<A.size();i++) { if(i&&(A[i]==A[i-1])) { A.erase(A.begin()+i); i--; } } print(A); } int main() { cin>>n; getchar(); getline(cin,s); if(n==0) { vector<int> a; int num=0; for(int 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); change(a); } else if(n==1) { vector<double> b; double num=0; int flag=0,t=0; for(int i=0; i<s.size(); i++) { if(s[i]==' ') { num=num/pow(10,t); b.push_back(num); t=0,num=0,flag=0; } else if(s[i]=='.') { flag=1; } else { num=num*10+s[i]-'0'; if(flag==1) t++; } } num=num/pow(10,t); b.push_back(num); change(b); } else if(n==2) { vector<char> c; for(int i=0; i<s.size(); i++) { if(s[i]!=' ') c.push_back(s[i]); } change(c); } else if(n==3) { vector<string> d; string str; str.clear(); for(int i=0; i<s.size(); i++) { if(s[i]==' ') { d.push_back(str); str.clear(); } else str+=s[i]; } d.push_back(str); change(d); } else cout<<"err"<<endl; return 0; }
#include <iostream> #include <vector> #include <sstream> #include <cstring> using namespace std; int n; string s; template<class T> void print(vector<T> &A) { typename std::vector<T>::iterator it=A.begin(); for(;it!=A.end()-1;it++) cout<<*it<<","; cout<<*it<<endl; } template<class T> void dele(stringstream &input,vector<T> &A) { T str; while(input>>str)A.push_back(str); print(A); cout<<endl; for(int i=0;i<A.size();i++) { if(i&&A[i]==A[i-1]) { A.erase(A.begin()+i); i--; } } print(A); } int main() { cin>>n; getchar(); getline(cin,s); stringstream input(s); if(n==0) { vector<int> a; dele(input,a); } else if(n==1) { vector<double> b; dele(input,b); } else if(n==2) { vector<char> c; dele(input,c); } else if(n==3) { vector<string> d; dele(input,d); } else cout<<"err"<<endl; return 0; }