北京理工大学计算机学院复试上机题目
由于编者水平有限,如有错误,请多多包涵。欢迎各位指正,转载请注明,谢谢合作!
1. 输入十个正整数数字 从小到大排序
输入: : 1,2,5,7,9,10,45,67,24,26
输出: : 1,2,5,7,9,10,24,26,45,67
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int data[10];
for(int i=0;i<10;i++)
cin>>data[i];
sort(data,data+10);
for(i=0;i<10;i++)
cout<<data[i]<<" ";
cout<<endl;
return 0;
}
2.学生有(学号,姓名,性别,年龄),初始化三个学生的信息
( 10,wes,f,23 ) (20,ert,f,45)(30,str,t,89), 然后对学生信息进行插入和删除处理
例如: I12,rt,f,67 表示插入12,rt,f,67
D10 表示删除学号为10的学生的信息
每次操作完成以后输出所有学生的信息按学号从大到小排序
输入: I12,rt,f,67
输出:(10,wes,f,23),(12,rt,f,67),(20,ert,f,45),(30,str,t,89)
输入:D10
输出: (12,rt,f,67),(20,ert,f,45),(30,str,t,89)
#include<iostream>
#include<string>
#include<list>
using namespace std;
class stu{
public:
int no;
string name;
char sex;
int age;
// 重载运算符<,定义排序规则
bool operator < (const stu & A) const{
return no<A.no;
}
// 重载运算符==,定义比较规则
bool operator == (const int & A) const{
return no==A;
}
// 重载运算符<<,方便输出stu对象
friend ostream& operator <<(ostream&,stu&);
};
ostream& operator <<(ostream& output,stu& A){
output <<A.no<<" "<<A.name<<" "<<A.sex<<" "<<A.age;
return output;
}
int main()
{
list<stu> l; // 使用链表list插入、删除比较方便
stu temp; // 暂存临时学生信息
// 初始化
temp.no=10; temp.name="wes"; temp.sex='f'; temp.age=23;
l.insert(l.begin(),temp);
temp.no=20; temp.name="ert"; temp.sex='f'; temp.age=45;
l.insert(l.begin(),temp);
temp.no=30; temp.name="str"; temp.sex='t'; temp.age=89;
l.insert(l.begin(),temp);
// 按学号从小到大的顺序排列
l.sort();
// 测试输出
list<stu>::iterator i;
for(i=l.begin();i!=l.end();i++){
cout<<(*i)<<endl;
}
cout<<"输入(以空格隔开数据):";
string m;
while(cin>>m){
int j=1;
int number=0;
// 提取学号
while(m[j]!='\0'){
number=(number*10)+m[j++]-'0';
}
// 插入数据
if(m[0]=='I'||m[0]=='i'){
temp.no=number;
cin>>temp.name;
cin>>temp.sex;
cin>>temp.age;
l.insert(l.begin(),temp);
}
// 删除数据
else if(m[0]=='D'||m[0]=='d'){
list<stu>::iterator i;
for(i=l.begin();i!=l.end();i++){
if((*i)==number){
l.erase(i);
break;
}
}
}
// 不合法输入
else{
cout<<"输入不合法!"<<endl;
cout<<"输入(以空格隔开数据):";
continue;
}
// 重新排序
l.sort();
// 遍历输出
list<stu>::iterator i;
for(i=l.begin();i!=l.end();i++)
cout<<(*i)<<endl;
cout<<"输入(以空格隔开数据):";
}
return 0;
}
3. 利用后序和中序确定前序遍历结果
示例:
输入 ( 按后序、中序) ) : CHBEDA CBHADE
输出:ABCHDE
#include<iostream>
#include<string>
using namespace std;
/**
* 后序遍历的最后一个节点,为当前树的根节点,
* 由此划分中序遍历的左右子树的所属节点
*/
string pre=""; // 前序遍历结果
string in; // 中序遍历结果
string post; // 后序遍历结果
void f(int lowIn,int highIn,int lowPost,int highPost){
// 递归出口
if(lowIn==highIn&&lowPost==highPost){
pre+=post[highPost];
return;
}
if(lowIn>=highIn||lowPost>=highPost)
return;
int i=100;
char temp=post[highPost]; // 当前后序遍历节点集中最后一个元素,为根节点
pre+=temp; // 根节点为此子树前序遍历的第一个节点
// 找出两棵树,以temp为根节点的左子树、右子树的节点,由此划分开来
// 找出根节点temp,在中序遍历中的位置
for(i=lowIn;i<=highIn;i++)
if(in[i]==temp)
break;
// 分析左子树
f(lowIn,i-1,lowPost,lowPost+i-lowIn-1);
// 分析右子树
f(i+1,highIn,lowPost+i-lowIn,highPost-1);
}
int main()
{
cout<<"输入中序遍历顺序:";
cin>>in;
cout<<"输入后序遍历顺序:";
cin>>post;
// 分析两种遍历
f(0,in.length()-1,0,post.length()-1);
// 输出结果
cout<<pre<<endl;
return 0;
}