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