目录
1.题目
顺序表ADT模板及其简单应用算法设计:比较两个顺序表的大小
作者: 冯向阳时间限制: 1S章节: DS:线性表
问题描述 :
目的:使用自行设计的顺序表ADT或STL中的vector模板,设计并实现顺序表应用场合的一些简单算法设计。
应用2:试设计一个算法,实现两个顺序表A、B大小的比较。若 A<B,则返回 -1;若 A=B,则返回 0;若 A>B,则返回 1。
参考函数原型:
(1)顺序表ADT版本
template<class ElemType>
int ListCompare( Sqlist<ElemType> &A, Sqlist<ElemType> &B );(2)vector版本
template<class ElemType>
int ListCompare( vector<ElemType> &A, vector<ElemType> &B );输入说明 :
第一行:顺序表的数据元素类型标记(0:int;1:double;2:char;3:string;其余值:输出err)
第二行:顺序表A的数据元素(数据元素之间以空格分隔)
第三行:顺序表B的数据元素(数据元素之间以空格分隔)
输出说明 :
第一行:第一个顺序表的遍历结果(数据元素之间以“,”分隔):空表时输出“NULL”
第二行:第二个顺序表的遍历结果(数据元素之间以“,”分隔):空表时输出“NULL”
空行
第三行:比较结果:若 A<B,则返回 -1;若 A=B,则返回 0;若 A>B,则返回 1。
输入范例 :
0
13 5 27 9 32 123 76 98 54 87
13 5 27 9 32 164 5 8输出范例 :
13,5,27,9,32,123,76,98,54,87
13,5,27,9,32,164,5,8-1
2.题解
- 读题:使用vector或者手写adt实现顺序表(我选了vector),并且实现顺序表比较大小的算法
- 造表:由于上一题已经实现了造表,所以这里只需要复制上一题代码即可。值得注意的是此题题目提示了存在空表的情况,所以需要把复制的代码进行修改(上一题没有考虑空表情况)。另外此题需要造两个表所以可以把造表的代码写成函数以实现代码复用(省事)。
- 表的比较算法:分两个层级的分支比较。第一层级:两个表的长度相同或不相同。第二层级:遍历较短的表逐个比较数据的大小。
3.代码实现
- 造表代码复制以及修改
//写成函数,还有空表的考虑, vector<int> f0(string s) { if(s=="")break;//空表特判 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'; } } if(s!="")a.push_back(num);//空表特判 return a; } vector<double> f1(string s) { if(s=="")break; 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++; } } if(s!="")num=num/pow(10,t),b.push_back(num); return b; } vector<char> f2(string s) { if(s=="")break; vector<char> c; for(int i=0; i<s.size(); i++) { if(s[i]!=' ') c.push_back(s[i]); } return c; } vector<string> f3(string s) { if(s=="")break; 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]; } if(str!="") d.push_back(str); return d; }
- 比较算法
//print函数 template<class T> void print(vector<T> &A) { if(A.size()==0)//空表 { cout<<"NULL"<<endl; return; } int i; for(i=0; i<A.size()-1; i++) cout<<A[i]<<","; cout<<A[i]<<endl; } //比较算法 template<class T> int cmp(vector<T> &a,vector<T> &b) { print(a); print(b); cout<<endl; int la=a.size(),lb=b.size(); if(la!=lb) { if(la<lb) { for(int i=0; i<la; i++) { if(a[i]!=b[i]) return a[i]<b[i]?-1:1; } return -1; } else { for(int i=0; i<lb; i++) { if(a[i]!=b[i]) return a[i]<b[i]?-1:1; } return 1; } } else { for(int i=0; i<a.size(); i++) { if(a[i]!=b[i]) return a[i]<b[i]?-1:1; } return 0; } }
-
完整代码(这个是我ac的代码,我一开始没有考虑空表,然后查看错误数据,发现string类型有空表情况,所以就只修改了造string类型需要考虑空表的情况,其他类型没有修改就过了,只能说数据还是挺水的哈)
#include <iostream> #include <cstring> #include <vector> #include <algorithm> using namespace std; int n; string s1,s2; template<class T> void print(vector<T> &A) { if(A.size()==0) { cout<<"NULL"<<endl; return; } int i; for(i=0; i<A.size()-1; i++) cout<<A[i]<<","; cout<<A[i]<<endl; } template<class T> int cmp(vector<T> &a,vector<T> &b) { print(a); print(b); cout<<endl; int la=a.size(),lb=b.size(); if(la!=lb) { if(la<lb) { for(int i=0; i<la; i++) { if(a[i]!=b[i]) return a[i]<b[i]?-1:1; } return -1; } else { for(int i=0; i<lb; i++) { if(a[i]!=b[i]) return a[i]<b[i]?-1:1; } return 1; } } else { for(int i=0; i<a.size(); i++) { if(a[i]!=b[i]) return a[i]<b[i]?-1:1; } return 0; } } vector<int> f0(string s) { 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); return a; } vector<double> f1(string s) { 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); return b; } vector<char> f2(string s) { vector<char> c; for(int i=0; i<s.size(); i++) { if(s[i]!=' ') c.push_back(s[i]); } return c; } vector<string> f3(string s) { 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]; } if(str!="") d.push_back(str); return d; } int main() { cin>>n; getchar(); getline(cin,s1); getline(cin,s2); if(n==0) { vector<int> A1,A2; A1=f0(s1); A2=f0(s2); cout<<cmp(A1,A2)<<endl; } else if(n==1) { vector<double> B1,B2; B1=f1(s1); B2=f1(s2); cout<<cmp(B1,B2)<<endl; } else if(n==2) { vector<char> C1,C2; C1=f2(s1); C2=f2(s2); cout<<cmp(C1,C2)<<endl; } else if(n==3) { vector<string> D1,D2; D1=f3(s1); D2=f3(s2); cout<<cmp(D1,D2)<<endl; } else cout<<"err"<<endl; return 0; }