DHU数据结构-顺序表- ADT应用-有序表的提纯(去重)

目录

1.题目

2.题解

3.代码实现


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值