1.顺序表ADT模板设计及简单应用:将顺序表中前 m 个元素和后 n 个元素进行互换

1.顺序表ADT模板设计及简单应用:将顺序表中前 m 个元素和后 n 个元素进行互换

问题描述:

目的:使用自行设计的顺序表ADT或STL中的vector模板,设计并实现顺序表应用场合的一些简单算法设计。

应用1:试设计一个算法,用尽可能少的辅助空间将非空顺序表中前 m 个元素和后 n 个元素进行互换,即将线性表(a1,a2,…,am,b1,b2,…,bn) 改变成(b1,b2,…,bn,a1,a2,…,am)。假定m始终是有效值。

参考函数原型:
(1)顺序表ADT版本
template
void Exchange( SqList &A, int m ); // 本算法实现顺序表中前 m 个元素和后 n 个元素的互换

(2)vector版本
template
void Exchange( vector &A, int m );// 本算法实现顺序表中前 m 个元素和后 n 个元素的互换

输入说明:

第一行:顺序表的数据元素类型标记(0:int;1:double;2:char;3:string;其余值:输出err)
第二行:待处理顺序表的数据元素(数据元素之间以空格分隔)
第三行:逆置位置m

输出说明:

第一行:逆置前顺序表的遍历结果(数据元素之间以“,”分隔)
空行
第三行:逆置后顺序表的遍历结果(数据元素之间以“,”分隔)

思路:

乍一看很简单的一道题,但是一看输入的格式,当场崩溃,四种不同类型的输入,中间还带着空格, 处理起来着实很麻烦。用getline输入一整行,然后遇到空格的时候把当前的数据存入vector数组中,特别要注意的是double类型时的处理。
把数据的输入处理完成后,数与数的调换就很简单了:
当m=3时,设原来的序列为a1,a2,a3,b1,b2,b3,b4,b5 ,vector所包含的元素个数是k个。
第一步反转整个序列,得出结果:
b5,b4,b3,b2,b1,a3,a2,a1
第二步反转1~(k-m)的部分,得出结果:
b1,b2,b3,b4,b5,a3,a2,a1
第三步反转k~(m-k)的部分.得出答案:
b1,b2,b3,b4,b5,a1,a2,a3

AC代码:

#include<bits/stdc++.h>
using namespace std;
template<class ElemType>
void Exchange( vector<ElemType> &A, int m )
{
    
    
    int n=A.size()-m;
    reverse(A.begin(),A.end());
    reverse(A.begin(),A.begin()+n);
    reverse(A.begin()+n,A.end());
}
int main()
{
    
    
    int kind;
    cin>>kind;
    getchar();
    if(kind!=0&&kind!=1&&kind!=2&&kind!=3)
    {
    
    
        cout<<"err"<<endl;
        return 0;
    }
    string s;
    int m;
    if(kind==0)
    {
    
    
        getline(cin,s);
        cin>>m;
        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;
        Exchange(a,m);
        cout<<a[0];
        for(int i=1; i<a.size(); i++)
        {
    
    
            cout<<','<<a[i];
        }
    }
    if(kind==1)
    {
    
    
        getline(cin,s);
        cin>>m;
        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;
        Exchange(b,m);

        cout<<b[0];
        for(int i=1; i<b.size(); i++)
        {
    
    
            cout<<','<<b[i];
        }
        cout<<endl;
    }
    if(kind==2)
    {
    
    
        getline(cin,s);
        cin>>m;
        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;
        Exchange(c,m);
        cout<<c[0];
        for(int i=1; i<c.size(); i++)
        {
    
    
            cout<<','<<c[i];
        }
        cout<<endl;
    }
    if(kind==3)
    {
    
    
        getline(cin,s);
        cin>>m;
        vector<string>d;
        string k;
        k.clear();
        for(unsigned i=0;i<s.size();i++)
        {
    
    
            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;
        Exchange(d,m);
        cout<<d[0];
        for(unsigned i=1;i<d.size();i++)
        {
    
    
            cout<<','<<d[i];
        }
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/m0_51727949/article/details/114372322