DHU数据结构-顺序表-ADT应用-比较两个顺序表的大小

目录

1.题目

2.题解

3.代码实现


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;
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值