顺序表ADT模板设计及简单应用:将顺序表中前 m 个元素和后 n 个元素进行互换
作者: 冯向阳时间限制: 1S章节: DS:线性表
截止日期: 2022-06-30 23:55:00
问题描述 :
目的:使用自行设计的顺序表ADT或STL中的vector模板,设计并实现顺序表应用场合的一些简单算法设计。
应用1:试设计一个算法,用尽可能少的辅助空间将非空顺序表中前 m 个元素和后 n 个元素进行互换,即将线性表(a1,a2,…,am,b1,b2,…,bn) 改变成(b1,b2,…,bn,a1,a2,…,am)。假定m始终是有效值。
参考函数原型:
(1)顺序表ADT版本
template<class ElemType>
void Exchange( SqList<ElemType> &A, int m ); // 本算法实现顺序表中前 m 个元素和后 n 个元素的互换
(2)vector版本
template<class ElemType>
void Exchange( vector<ElemType> &A, int m );// 本算法实现顺序表中前 m 个元素和后 n 个元素的互换
输入说明 :
第一行:顺序表的数据元素类型标记(0:int;1:double;2:char;3:string;其余值:输出err)
第二行:待处理顺序表的数据元素(数据元素之间以空格分隔)
第三行:逆置位置m
输出说明 :
第一行:逆置前顺序表的遍历结果(数据元素之间以“,”分隔)
空行
第三行:逆置后顺序表的遍历结果(数据元素之间以“,”分隔)
输入范例 :
0
13 5 27 9 32 123 76 98 54 87
5
输出范例 :
13,5,27,9,32,123,76,98,54,87
123,76,98,54,87,13,5,27,9,32
AC代码:
#include<iostream>
#include<cstring>
#include<vector>
#include<cmath>
#include<algorithm>
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 Type,m;
string str;
cin>>Type;
getchar();
if(Type!=0&&Type!=1&&Type!=2&&Type!=3)
{
cout<<"err"<<endl;
return 0;
}
else if(Type==0)
{
int num1=0;
getline(cin,str);
cin>>m;
vector<int>a;
for (int i=0; i<str.size(); i++)
{
if (str[i]==' ')
{
a.push_back(num1);
num1=0;
}
else
{
num1=num1*10+str[i]-'0';
}
}
a.push_back(num1);
for(int i=0; i<a.size(); i++)
{
if(i==a.size()-1)
{
cout<<a[i];
}
else cout<<a[i]<<',';
}
cout<<endl;
cout<<endl;
Exchange(a,m);
for(int i=0; i<a.size(); i++)
{
if(i==a.size()-1)
{
cout<<a[i];
}
else cout<<a[i]<<',';
}
}
else if(Type==1)
{
getline(cin,str);
double num2=0.0,sum=0.0;
int flag=0,t=0;
cin>>m;
vector<double>b;
for(int i=0; i<str.size(); i++)
{
if(str[i]==' ')
{
int k=1;
for(int j=0;j<t;j++)
{
k*=10;
}
num2/=k;
b.push_back(num2);
num2=0.0;
flag=0;
t=0;
}
else if(str[i]=='.')
{
flag=1;
}
else
{
num2=num2*10+str[i]-'0';
if(flag==1)
{
t++;
}
}
}
int k=1;
for(int j=0;j<t;j++)
{
k*=10;
}
num2/=k;
b.push_back(num2);
for(int i=0; i<b.size(); i++)
{
if(i==b.size()-1)
{
cout<<b[i];
}
else cout<<b[i]<<',';
}
cout<<endl;
cout<<endl;
Exchange(b,m);
for(int i=0; i<b.size(); i++)
{
if(i==b.size()-1)
{
cout<<b[i];
}
else cout<<b[i]<<',';
}
cout<<endl;
}
else if(Type==2)
{
getline(cin,str);
cin>>m;
vector<char> c;
char CH;
for(int i=0; i<str.size(); i++)
{
CH=str[i];
if(CH!=' ')
{
c.push_back(CH);
}
}
for(int i=0; i<c.size(); i++)
{
if(i==c.size()-1)
{
cout<<c[i];
}
else cout<<c[i]<<',';
}
cout<<endl;
cout<<endl;
Exchange(c,m);
for(int i=0; i<c.size(); i++)
{
if(i==c.size()-1)
{
cout<<c[i];
}
else cout<<c[i]<<',';
}
cout<<endl;
}
else if(Type==3)
{
getline(cin,str);
cin>>m;
vector<string>d;
string p;
p="";
p.clear();
for(int i=0; i<str.size(); i++)
{
if(str[i]==' ')
{
d.push_back(p);
p.clear();
}
else
{
p+=str[i];
}
}
d.push_back(p);
for(int i=0; i<d.size(); i++)
{
if(i==d.size()-1)
{
cout<<d[i];
}
else cout<<d[i]<<',';
}
cout<<endl;
cout<<endl;
Exchange(d,m);
for(int i=0; i<d.size(); i++)
{
if(i==d.size()-1)
{
cout<<d[i];
}
else cout<<d[i]<<',';
}
}
return 0;
}