【超级完整】北京理工大学计算机复试机试历年真题答案2003年-2018年

目 录

1-2003两个空间坐标求球的体积 1

2-2003计算某一天是一年的第几天 2

3-2003学生根据学号进行文件的读取 3

1-2004多项式的类去递归求值 5

3-2004一元二次方程求值 7

1-2005复数类的封装和重载复数相加 7

1-2006打印直角三角形 9

2-2006数字的逆序输出 11

1-2007递归求小球下落弹起到静止的长度 13

2-2007运算符重载计算两个坐标的距离 14

3-2007学生类的增删改 14

4-2007计算三个坐标是否构成直角三角形 17

1-2008一个日期加上天数变成新的日期 18

2-2008计算两个日期相差多少天 20

3-2008除数是0或者数组越界捕捉异常 23

1-2009字符串处理+另存文件 24

2-2009统计分组元素 24

3-2009统计单词词频 27

1-2010中缀转二叉树输出 28

1-2011-统计首字母相同的单词 33

2-2011-领导关系 34

3-2011-单词排序 36

1-2012-学生对象的插入删除 37

2-2012-数字排序 40

3-2012-后序中序确定树输出前序 41

1-2013-最小公约数公倍数 42

2-2013-字符串排序 43

3-2013-运算符优先级 44

4-2013-二叉树中序转前序+运算符优先级 45

1-2014-输出三个最近使用文件有重复就不打乱文件顺序 47

2-2014-输出最近使用三个文件 49

1-2015-正方形打印空心菱形 50

2-2015-输出限制字符长度的全排列 52

3-2015-火车输出序列堆栈的使用 52

4-2015-单词排序不区分大小写 54

1-2016-字符串中摘取数字 55

2-1016-指定精度计算PI值 59

3-2016-数字转字符串 59

4-2016-链表存奇偶数 60

5-2016-动态开辟数组数目 63

6-2016递归求字符串的长度 64

7-2016-单词排序 64

1-2017-统计学生没及格输出 65

2-2017-限制字符串的全排列 66

3-2017-字符串中的元素排序 67

4-2017-身份证校验码 68

5-2017-全排列 68

6-2017-求字符串的全部子串 70

7-2017-判断n是否在n的平方最右边 70

8-2017-二分查找 71

9-2017-打印菱形 72

10-2017-打印等腰三角形 73

1-2018-求字符集交集 73

2-2018-求一个偶数是哪两个素数之和 74

题目是我简写的,代码注重逻辑,有些可能没有规范输出。如果有任何疑问,可直接去查年份对应的题目参考综合学习。

 

 

 

 

 

 

 

 

 

 

1-2003两个空间坐标求球的体积

#include<iostream>

#include<vector>

#include<iomanip>

#include<cmath>

#define Max 100

double const PI=3.141592;

using namespace std;

class  ThreeDimensionalSpace{

public:

double x;

double y;

double z;

public :

ThreeDimensionalSpace(double x1,double y1,double z1)

{

x = x1;

y = y1;

z = z1;

}

double operator - (ThreeDimensionalSpace b);

};

double ThreeDimensionalSpace::operator - (ThreeDimensionalSpace b)

{

return sqrt((x-b.x)*(x-b.x)+(y-b.y)*(y-b.y)+(y-b.y)*(y-b.y));

}

int main()

{

double x1,y1,z1;

double x2,y2,z2;

while(1)

{

cout<<"输入球心坐标"<<endl;

cin>>x1>>y1>>z1;

cout<<"输入球表面的一个坐标"<<endl;

cin>>x2>>y2>>z2;

ThreeDimensionalSpace a(x1,y1,z1);

ThreeDimensionalSpace b(x2,y2,z2);

double r = a-b;

double V = (4/3)*PI*r*r*r;

cout<<setprecision(4)<<setiosflags(ios::fixed);

cout<<"半径="<<r<<"体积="<<V<<endl;

 

}

}

2-2003计算某一天是一年的第几天

#include<iostream>

#include<vector>

#include<fstream>

#include<string>

#include<cstring>

using namespace std;

 

int dayTab[2][13]={

{0,31,28,31,30,31,30,31,31,30,31,30,31},

{0,31,29,31,30,31,30,31,31,30,31,30,31}

};

bool IsLeapYear(int year)

{

return ((year%4==0)&&(year%100!=0))||(year%400==0);

}

bool Isnumber(char a)

{

if((a<'9'||a=='0' )&&(a>'0'||a=='9'))

{

return true;

}else

{

return false;

}

 

}

//判断字符是否是中文

int IsChinese(char p){

    if(~(p >> 8) == 0)

    {

        return 1;

    }

    return -1;

}

void GetString(string s,int &year,int &month,int &day)

{

int pos =0;

int k=0;

int size = s.size();

for(int i=0;i!=s.size();i++)

{

if(IsChinese(s[i])==1)

{

string temps= s.substr(pos,i-pos);

pos = i+2;

i++;

int y =stoi(temps);

if(k==0)

{

year = y;

}else if(k==1)

{

month =y;

}else

{

day = y;

}

k++;

}

}

}

int main()

{

string str ="2020年12月31日";

int year,month,day;

GetString(str,year,month,day);

//cout<<year<<" "<<month<<" "<<day<<endl;

int acount=0;

int row = IsLeapYear(year);

for(int i=1;i<month;i++)

{

acount +=dayTab[row][i];

}

acount +=day;

cout<<year<<"-"<<month<<"-"<<day<<"是"<<year<<"年的第"<<acount<<"天"<<endl;

 

}

3-2003学生根据学号进行文件的读取

#include<iostream>

#include<vector>

#include<fstream>

#include<string>

#include<cstring>

using namespace std;

int main()

{

while(1)

{

cout<<"输入功能: 1、写入文件 2、根据学号查询信息"<<endl;

int id;

cin>>id;

switch(id)

{

case 1:

{

ofstream outfile;

outfile.open("D:\\FileStore.txt");

outfile<<"01 李男 21"<<endl;

outfile<<"02 刘男 20"<<endl;

outfile.close();

break;

}

case 2:

{

cout<<"输入学号"<<endl;

int number;

cin>>number;

cout<<number<<endl;

ifstream infile;

infile.open("D:\\FileStore.txt");

string s;

while(getline(infile,s))

{

string filenum =s.substr(0,2);

int n = stoi(filenum);//字符串转数字

if(number==n)

{

cout<<s<<endl;

}

}

infile.close();

break;

}

}

 

}

}

1-2004多项式的类去递归求值

#include<iostream>

#include<vector>

#include<iomanip>

#include<cmath>

#define Max 100

using namespace std;

class  MutipleClass{

public:

double x;

int n;//vector大小

vector<double>vec;//[Max];

MutipleClass(double y,vector<double>v,int size)

{

x =y;

vec = v;

n =size;

}

double GetResult(vector<double>,int n,double x)

{

if(n==0)

{

return vec[n];

}else

{

return GetResult(vec,n-1,x)+vec[n]*pow(x,n);

}

}

};

int main()

{

int n;

cout<<"输入系数个数"<<endl;

while(cin>>n)

{

double x;

cout<<"输入x的值"<<endl;

cin>>x;

cout<<"输入系数"<<endl;

vector<double>vec;

for(int i=0;i<n;i++)

{

double t;

cin>>t;

vec.push_back(t);

}

MutipleClass m(x,vec,vec.size());

cout<<setprecision(2)<<setiosflags(ios::fixed);

cout<<"结果是="<<m.GetResult(vec,vec.size()-1,x)<<endl;

}

}

2-2004计算正弦函数重载减号

#include<iostream>

#include<cmath>

#include<iomanip>

 double const PI = 3.1415;

using namespace std;

class Angle{

private:

double x;

public :

Angle(double n)

{

x=n;

}

Angle operator - (Angle a);

void Sin()

{

double xx =x*PI/180;

cout<<"正弦值是:"<<xx<<endl;

}

};

Angle Angle::operator - (Angle a)

{

Angle T(x-a.x);;

return T;

}

int main()

{

double x,y;

cout<<"输入两个角度计算正弦值:"<<endl;

while(cin>>x>>y)

{

Angle a(x);

a.Sin();

Angle b(y);

b.Sin();

Angle t = a-b;

t.Sin();

}

}

3-2004一元二次方程求值

#include<iostream>

#include<cmath>

#include<iomanip>

 double const PI = 3.1415;

using namespace std;

int main()

{

double a,b,c;

cout<<"输入a b c"<<endl;

while(cin>>a>>b>>c)

{

if(a==0)

{

cout<<"a不能为零,重新输入"<<endl;

}else

{

double temp = b*b-4*a*c;

if(temp==0)

{

cout<<setprecision(2)<<setiosflags(ios::fixed);

cout<<"只有一个解x="<<-(b/(2*a))<<endl;

}else if(temp<0)

{

cout<<"无解"<<endl;

}else

{

double x1 = (-b+sqrt(temp))/(2*a);

double x2 = (-b-sqrt(temp))/(2*a);

cout<<setprecision(2)<<setiosflags(ios::fixed);

cout<<"第一个解x1="<<x1<<endl;

cout<<setprecision(2)<<setiosflags(ios::fixed);

cout<<"第二个解x2="<<x2<<endl;

}

}

}

}

1-2005复数类的封装和重载复数相加

#include<iostream>

#include<iomanip>

using namespace std;

 

class VirtualNumber{

public :

double vir;

double entity;

public:

VirtualNumber(double e,double v)

{

vir = v;

entity = e;

}

//运算符重载

VirtualNumber operator +(VirtualNumber v);

//类型转换函数,实现double x=a的赋值

operator double(){

return vir+entity;

}

 

void show()

{

cout<<setprecision(2)<<setiosflags(ios::fixed);

cout<<entity<<"+"<<vir<<"i"<<endl;

}

 

};

VirtualNumber VirtualNumber::operator +(VirtualNumber v)

{

VirtualNumber t(entity+v.entity,vir+v.vir);

 

return t;

}

 

int main()

{

double x1,y1,x2,y2;

cout<<"输入两个复数并相加输出 "<<endl;

while(cin>>x1>>y1>>x2>>y2)

{

VirtualNumber a(x1,y1);

VirtualNumber b(x2,y2);

VirtualNumber c = a+b;

c.show();

double x = a;

cout<<setprecision(2)<<setiosflags(ios::fixed);

cout<<a<<endl;

 

 

}

}

1-2006打印直角三角形

#include<iostream>

#include<cmath>

#include<iomanip>

using namespace std;

class Cpoint{

double x,y;

public:

Cpoint(double xx,double yy){

x =xx;

y =yy;

}

double operator-(Cpoint c);

};

double Cpoint::operator-(Cpoint c){

return sqrt((x-c.x)*(x-c.x)+(y-c.y)*(y-c.y));

}

class CTriangle{

public:

double x1,y1;

double x2,y2;

double x3,y3;

public:

CTriangle (int a,int b,int c,int d,int e,int f)

{

x1=a;

y1=b;

x2=c;

y2=d;

x3=e;

y3=f;

}

CTriangle operator+(CTriangle c);

void BuildTriangle()

{

Cpoint A(x1,y1);//在纵坐标上

Cpoint B(x2,y2);//原点

Cpoint C(x3,y3);//横坐标

int len1 = A-B;

int len2 =B-C;

int len3 =A-C;

cout<<"三角形是"<<endl;

cout<<"A"<<endl;

for(int row=0;row<len1;row++)

{

cout<<"|";

for(int i=0;i<row+1;i++)

{

cout<<" ";

}

cout<<"\\"<<endl;

}

cout<<"B";

for(int col=0;col<len1;col++)//这个三角形的底边长和题目不一样,否则三角形不好看,为了调整降低了三角形的底边长度

{

cout<<"-";

}

cout<<"C"<<endl;

}

};

CTriangle CTriangle::operator+(CTriangle c)

{

CTriangle t(x1+c.x1,y1+c.y1,x2+c.x2,y2+c.y2,x3+c.x3,y3+c.y3);

return t;

}

 

int main()

{

CTriangle T(0,0,0,0,0,0);//初始化一个三角形,可以叠加

double x,y;

string s;

cout<<"输入纵坐标、横坐标"<<endl;

while(getline(cin,s))

{

if(s=="0")

{

T.BuildTriangle();

 

}else

{

int pos = s.find(" ");

int x=stoi(s.substr(0,pos+1));//从字符串中获取x

int y=stoi(s.substr(pos+1));//从字符串中获取y

cout<<"输入第一个坐标"<<endl;

CTriangle N(0,y,0,0,x,0);

T = N+T;

T.BuildTriangle();

 

}

}

 

}

2-2006数字的逆序输出

#include<iostream>

#include<vector>

#include<string>

#include<algorithm>

using namespace std;

//从字符串中取出数字

void GetString(string str,vector<int>&vec)

{

int pos = 0;

for(int i=0;i<str.size();i++)

{

if(str[i]==',')

{

string temps = str.substr(pos,i-pos);

int n = stoi(temps);//字符串转整型,在头文件string中

pos = i+1;

//遇到0就结束,不再取数字

if(n!=0)

{

vec.push_back(n);

}else

{

return;

}

}

}

string temps = str.substr(pos);

int n = stoi(temps);

vec.push_back(n);

}

//把数字逆序

int Reverse(int x)

{

int tempn=0;

while(x!=0)

{

tempn *=10;

tempn +=x%10;

x /= 10;

}

return tempn;

}

//类

class GetReverse {

public:

int number;

int renumber;

public:

GetReverse(int n,int ren)

{

number = n;

renumber = ren;

}

void show(){

cout<<number<<" "<<renumber<<endl;

}

};

int main()

{

string str ="1234,2356,7891,5678";

vector<int>vec;

vector<GetReverse>vex;

//while(cin>>str)

//{

GetString(str,vec);

//控制十个数量

for(int i=0;i<vec.size()&&i<10;i++)

{

GetReverse T(vec[i],Reverse(vec[i]));

vex.push_back(T);

}

for(int i=0;i<vex.size();i++)

{

vex[i].show();

 }

//}

}

1-2007递归求小球下落弹起到静止的长度

#include<iostream>

#include <iomanip>

using namespace std;

double GetPath(double h,int n)

{

if(n==1)

{

//小心第一次是小球从高处落到底就是一次,路径就是H

return h;

}else

{

 

return h+h/2+GetPath(h/2,n-1);

}

}

int main()

{

int m;

    //cin>>m;

    double h;

int n;

    while(cin>>m)

    {

        for(int i=0;i<m;i++)

        {

         cin>>h>>n;

         //printf("%.2lf\n",GetPath(h,n));

         //控制C++输出精度

         cout << setprecision(2) << setiosflags(ios::fixed);

         cout<<GetPath(h,n)<<endl;

}

        //cout<<GetPath(h,n)<<endl;

        

    }

 

 

}

 

2-2007运算符重载计算两个坐标的距离

#include<iostream>

#include<cmath>

#include<iomanip>

using namespace std;

class Cpoint{

double x,y;

public:

Cpoint(double xx,double yy){

x =xx;

y =yy;

}

double operator-(Cpoint c);

};

double Cpoint::operator-(Cpoint c){

return sqrt((x-c.x)*(x-c.x)+(y-c.y)*(y-c.y));

}

int main()

{

cout<<"输入第一个坐标"<<endl;

int x1,y1;

cin>>x1>>y1;

Cpoint a(x1,y1);

cout<<"输入第二个坐标"<<endl;

int x2,y2;

cin>>x2>>y2;

Cpoint b(x2,y2);

cout<<"两个坐标之间的距离是"<<a-b<<endl;

cout<<setprecision(4)<<setiosflags(ios::fixed);

cout<<sqrt(2)*2<<endl;

printf("%.4lf",2*sqrt(2));

 

}

3-2007学生类的增删改

#include<iostream>

#include<vector>

#include<cstring>

#include<algorithm>

using namespace std;

class Student{

public:

char name[10];

int num;

public:

Student(){

}

Student(char n[10],int m)

{

strcpy(name,n);

num =m;

}

public:

void show()

{

cout<<"姓名:"<<name<<"  学号:"<<num<<endl;

}

};

bool compareDec(Student x,Student y)

{

return x.num>y.num;

}

bool compareAsc(Student x,Student y)

{

return x.num<y.num;

}

int main()

{

vector<Student>vec;

int id;

char name[10];

int number;

while(1){

cout<<"输入需要的功能,1:添加学生 2:查询某个学生 3:降序浏览学生 4:升序浏览学生"<<endl;

cin>>id;

switch(id)

{

case 1:

{

cout<<"输入添加的学生数目"<<endl;

int n;

cin>>n;

cout<<"输入学生名字 学号"<<endl;

while(n--)

{

cin>>name>>number;

//strcpy(names,name);

Student stu(name,number);

vec.push_back(stu);

}

break;

}

case 2:

{

cout<<"输入学生学号"<<endl;

cin>>number;

int flag=0;

for(int i=0;i<vec.size();i++)

{

if(vec[i].num==number)

{

vec[i].show();

flag =1;

}

}

if(flag==0)

{

cout<<"没有查找到"<<endl;

}break;

}

case 3:

{

sort(vec.begin(),vec.end(),compareDec);//降序

for(int i=0;i<vec.size();i++)

{

vec[i].show();

} break;

}

case 4:

{

sort(vec.begin(),vec.end(),compareAsc);//降序

for(int i=0;i<vec.size();i++)

{

vec[i].show();

} break;

}

 }

}

}

4-2007计算三个坐标是否构成直角三角形

#include<iostream>

#include<cmath>

#include<iomanip>

using namespace std;

class Cpoint{

double x,y;

public:

Cpoint(double xx,double yy){

x =xx;

y =yy;

}

double operator-(Cpoint c);

};

double Cpoint::operator-(Cpoint c){

return sqrt((x-c.x)*(x-c.x)+(y-c.y)*(y-c.y));

}

class CTriangle{

double x1,y1;

double x2,y2;

double x3,y3;

public:

CTriangle (int a,int b,int c,int d,int e,int f)

{

x1=a;

y1=b;

x2=c;

y2=d;

x3=e;

y3=f;

}

void Print()

{

Cpoint A(x1,y1);

Cpoint B(x2,y2);

Cpoint C(x3,y3);

int len1 = A-B;

int len2 =B-C;

int len3 =A-C;

if(len1>len3)//需要len3大

{

swap(len1,len3);

}

if(len2>len3)//需要len3大

{

swap(len2,len3);

}

if(len3*len3 == len2*len2+len1*len1)

{

cout<<setprecision(2)<<setiosflags(ios::fixed);

cout<<"Yes"<<"边长是"<<len1+len2+len3<<endl;

}else

{

cout<<"不是三角形"<<endl;

}

}

};

int main()

{

int m;

while(cin>>m){

 

int x1,y1,x2,y2,x3,y3;

while(m--)

{

cin>>x1>>y1>>x2>>y2>>x3>>y3;

CTriangle Test(x1,y1,x2,y2,x3,y3);

Test.Print();

}

}

}

1-2008一个日期加上天数变成新的日期

#include<iostream>

#include<vector>

#include<string>

#include<string>

using namespace std;

int daytab[2][13]={

{0,31,28,31,30,31,30,31,31,30,31,30,31},//平年

{0,31,29,31,30,31,30,31,31,30,31,30,31}//闰年

};

bool IsLeapYear(int year)

{

return(year%4 == 0&& year%100 !=0)||(year%400==0);

 }

int MuchDay(int year,int month,int day)

{

int number =0;

int row = IsLeapYear(year);

for(int j=0;j<month;j++)

{

number +=daytab[row][j];

}

number +=day;

return number;

}

void GetString(string str,int &year,int &month,int &day)

{

int pos=0;

int t =0;

for(int i=0;i<str.size();i++)

{

if(str[i]=='-')

{

string temps = str.substr(pos,i-pos);

int time = stoi(temps);

pos = i+1;

if(t==0){

year = time;

}else if(t==1)

{

month = time;

}

t++;

}

}

string temps = str.substr(pos);

int time = stoi(temps);

day   = time;

}

int NumberOfYear(int year)

{

if(IsLeapYear(year))return 366;

else return 365;

 }

int main()

{

string str ="2016-02-29";

int number =100;

int year,month,day;

GetString(str,year,month,day);

//先把月和日转换成天数,再去先后计算年,月,日

int amount =MuchDay(year,month,day);

while(number>NumberOfYear(year))

{

number -=NumberOfYear(year);

year++;

}

month =0;

int row = IsLeapYear(year);

while(number>daytab[row][month])

{

number -=daytab[row][month];

month++;

}

day =number;

cout<<year<<"-"<<month<<"-"<<day;

}

2-2008计算两个日期相差多少天

#include<iostream>

#include<vector>

#include<string>

#include<string>

using namespace std;

int daytab[2][13]={

{0,31,28,31,30,31,30,31,31,30,31,30,31},//平年

{0,31,29,31,30,31,30,31,31,30,31,30,31}//闰年

};

bool IsLeapYear(int year)

{

return(year%4 == 0&& year%100 !=0)||(year%400==0);

 }

int MuchDay(int year,int month,int day)

{

int number =0;

int row = IsLeapYear(year);

for(int j=0;j<month;j++)

{

number +=daytab[row][j];

}

number +=day;

return number;

}

void GetString(string str,int &year,int &month,int &day)

{

int pos=0;

int t =0;

for(int i=0;i<str.size();i++)

{

if(str[i]=='-')

{

string temps = str.substr(pos,i-pos);

int time = stoi(temps);

pos = i+1;

if(t==0){

year = time;

}else if(t==1)

{

month = time;

}

t++;

}

}

string temps = str.substr(pos);

int time = stoi(temps);

day   = time;

}

int main()

{

string str1 ="2000-02-29";

string str2 ="2020-02-29";

int year1,month1,day1;

int year2,month2,day2;

GetString(str1,year1,month1,day1);

GetString(str2,year2,month2,day2);

//cout<<year1<<" "<<month1<<" "<<day1;

int apart=0;

if(year1==year2)//在同一个年里,直接两个天数相减

{

if(month1>month2)

{

apart = MuchDay(year1,month1,day1)-MuchDay(year2,month2,day2);

}

else{

apart = MuchDay(year2,month2,day2)-MuchDay(year1,month1,day1);

}

}else//不在同一个年里

{

if(year1>year2)//如果第一个年大

{

if(IsLeapYear(year2))//把第二个年的剩余天数加起来

{

apart += 366 -MuchDay(year2,month2,day2);

}else{

apart += 365 -MuchDay(year2,month2,day2);

}

for(int i=year2+1;i<year1;i++)//把间隔的年的天数加起来

{

if(IsLeapYear(i))

{

apart +=366;

}

else

{

apart +=365;

}

}

apart +=MuchDay(year1,month1,day1);//把最大的年目前有多少天加起来

}else

{

if(IsLeapYear(year1))//第二个年大 ,则把第一年的剩余多少天加起来

{

apart += 366 -MuchDay(year1,month1,day1);

}

else{

apart += 365 -MuchDay(year1,month1,day1);

}

for(int i=year1+1;i<year2;i++)

{

if(IsLeapYear(i))

{

apart +=366;

}

else

{

apart +=365;

}

}

apart +=MuchDay(year2,month2,day2);

}

}

cout<<"两个年相差天数 "<<apart;

 

}

3-2008除数是0或者数组越界捕捉异常

#include<iostream>

#include<vector>

using namespace std;

class A{

};

class B{

};

int main()

{

cout<<"输出被除数和除数"<<endl;

int a,b;

cin>>a>>b;

vector<int>arr;

try{

if(b==0)

{

throw A();

}else

{

cout<<"结果是"<<a/b<<endl;

}

cout<<"输入数组长度"<<endl;

int length;

cin>>length;

cout<<"输入数组元素"<<endl;

//int i=0;

int n;

while(cin>>n)

{

if(n==0)break;

arr.push_back(n);

}

if(arr.size()>length)

{

throw B();

}

for(int i=0;i<arr.size();i++)

{

cout<<arr[i]<<" ";

}

cout<<endl;

}catch(A){

cout<<"被除数是0"<<endl;

}catch(B){

cout<<"数组越界"<<endl;

}

}

1-2009字符串处理+另存文件

#include<iostream>

#include<vector>

#include<string>

#include<sstream>

#include<fstream>

using namespace std;

int main()

{

string str;

int i=1;

string ss="";

while(cin>>str)

{

stringstream scout;//数字转字符

scout<<i;

string n = scout.str();

i++;

ss.append(n);

ss.append("=");

ss.append(str);

ss.append(" ");

//ofstream myfile;

ofstream outfile;

outfile.open("D:\\Name.txt");

outfile<<ss;

outfile.close();

cout<<ss<<endl;

}

}

2-2009统计分组元素

#include<iostream>

#include<vector>

#include<algorithm>

#define Max 100

using namespace std;

struct Child{

int data;

int count;

};

struct Answer{

int group;

Child child[Max];

};

void getString(vector<int>&vec,string str)

{

//vector<int>vec;

int pos;

for(int i=0;i<str.size();i++)

{

if(str[i]==',')

{

int n = str[i-1] -'0';

vec.push_back(n);

//cout<<n<<endl;

}

}

int n = str[str.size()-1] -'0';

vec.push_back(n);

}

int main()

{

string parents = "3,2,3,8,8,2,3";//父母数组

string child ="1,2,3,2,1,3,1";//孩子数组

vector<int>vecp;

vector<int>vecd;

getString(vecp,parents);

getString(vecd,child);

//父母数组中的元素  

vector<int>temp1 =vecp;

sort(temp1.begin(),temp1.end());

temp1.erase(unique(temp1.begin(),temp1.end()),temp1.end());

int n1 = temp1.size();

// 孩子数组中的元素

vector<int>temp2 =vecd;

sort(temp2.begin(),temp2.end());

temp2.erase(unique(temp2.begin(),temp2.end()),temp2.end());

int n2 = temp2.size();

 

Answer *answer = new Answer[vecp.size()];

//初始化 ,用一个结构体,包含孩子数组叫groupid,父母数组的元素和每个元素的出现次数count

for(int i=0;i<temp2.size();i++)

{

answer[i].group =temp2[i];

int t=0;

for(int j =0;j<vecd.size();j++)

{

int pp =vecp[j];

answer[i].child[pp].data =pp;

answer[i].child[pp].count =0;

}

 

}

//计算每个元素出现的次数并以该元素为下标

for(int i=0;i<temp2.size();i++)

{

answer[i].group =temp2[i];

int t=0;

int ac;

for(int j =0;j<vecd.size();j++)

{

if(temp2[i]==vecd[j])

{

 answer[i].child[vecp[j]].count +=1;

 ac = answer[i].child[vecp[j]].count;

}

}

}

//打印结果

for(int i=0;i<temp2.size();i++)//按孩子数组元素总类打出多少行

{

cout<<answer[i].group<<"={";

for(int j=0;j<temp1.size()-1;j++)//打印出每个父母数组中的每个元素和元素的次数

{

int tt = temp1[j];

cout<<answer[i].child[tt].data<<"="<<answer[i].child[tt].count<<",";//因为最后一个元素后面没有逗号,就把最后一个元素和元素次数摘出来单独打印

 

}

cout<<answer[i].child[temp1[temp1.size()-1]].data<<"="<<answer[i].child[temp1[temp1.size()-1]].count<<"}"<<endl;

}

}

3-2009统计单词词频

#include<iostream>

#include<vector>

#include<algorithm>

#define Max 100

using namespace std;

struct Word{

string words;

int number;

}arr[Max];

bool Compare(Word a,Word b)

{

return a.number>b.number;

}

int main()

{

string str="I am a teacher and I think you are a student,so i think you lie.";

int pos=0;

vector<string>vec;

vector<string>vex;

for(int i=0;i<str.size();i++)

{

if(str[i]==' ' ||str[i]==',' || str[i]=='.')

{

string w = str.substr(pos,i-pos);

pos = i+1;

if(w!="")

{

vec.push_back(w);

//cout<<w<<endl;

}

}

}

vex =vec;

sort(vex.begin(),vex.end());

vex.erase(unique(vex.begin(),vex.end()),vex.end());//必须先排序,该方法是去除相邻重复元素

cout<<vex.size()<<endl;

int k=0;

for(int j=0;j<vex.size();j++)

{

//cout<<vex[j]<<" "<<count(vec.begin(),vec.end(),vex[j])<<endl;

arr[k].words = vex[j];

arr[k].number =count(vec.begin(),vec.end(),vex[j]);//STL的count函数,很好用,计算第三个参数在vector中频率

k++;

}

sort(arr,arr+k,Compare);//数组排序,自定义排序规则

for(int m=0;m<k;m++)

{

cout<<arr[m].words<<" "<<arr[m].number<<endl;

}

}

1-2010中缀转二叉树输出

#include<iostream>

#include<stack>

#include<vector>

#include<ostream>

#include<string>

using namespace std;

/*

中缀建立二叉树的思路:

1.预处理字符串:把字符串中的每个部分都切割出来放进vector,因为存在有点数字是两位数以上,不能用字符串的下标去定位操作数。

2.先中缀转后缀

(1)符号进站,操作数直接输出,比较新来的符号和栈顶,栈顶大于或等于新来符号,循环输出栈顶直至栈顶不大于等于新来符号

3.后缀建立二叉树

(1)New一个结点,把结点data等于操作数然后进栈

(2)遇到符号,在栈中pop出两个元素进行,先后把结点的右孩子data赋值第一个元素,左孩子data赋值给第二个元素

*/

/*

遇到的几个新颖技术点:

1.字符转字符串:头文件<ostream> string s(1,字符),输出s就是字符串了

*/

typedef struct TreeNode{

string tag;

int data;

TreeNode *rchild,*lchild;

}Tree;

int Priority(char a,char b)//a是top,b是准备进栈元素

{

int p;

switch(a)

{

case '+':

case '-':

if(b=='*'||b=='/')

{

p= -1;break;

}else if(b=='+'||b=='-')

{

p= 0;break;

}

 

case '*':

case '/':

if(b=='*'||b=='/'){

p=0;break;

}else if(b=='+'||b=='-')

{

p=1;break;

}

case '(':

p = -1;break;

}

return p;

}

bool judge(char a)//判断是数字

{

int temp = a- '0';

for(int i=0;i<10;i++)

{

if(temp==i)

{

return true;

}

}

return false;

}

void GetString(vector<string>&vec,string str){

  int pos=0;

  for(int i=0;i<str.size();i++)

  {

 

  if(judge(str[i]) && !judge(str[i+1]))//该字符是数字,后一个是符号 ,则把数字部分截取出来

 {

  string temp = str.substr(pos,i-pos+1);//截取数字部分

  if(temp!="")

  {

  vec.push_back(temp);

}

}

else if(judge(str[i]) && judge(str[i+1]))//前后是数字部分 ,继续计算数字的长度

{

pos = i;

}else //前后都是字符,则pos往后移动

{

string s(1,str[i]);//把单个字符转为字符串。需要头文件ostream

vec.push_back(s);

pos =i+1;

}

}

 }

bool IsNumber(string str)//只需判断第一个字符是不是数字就判断是不是字符串

 {

  if(str[0]>'0'&&str[0]<'10')

  {

  return true;

 }

 else

 {

  return false;

 }

 }

void PrintTree(TreeNode *T){

if(T==NULL)

{

return;

}

PrintTree(T->lchild);

PrintTree(T->rchild);

cout<<T->data<<" ";

}

int Deal(int a,int b,string x)

{

if(x=="*")

{

return a*b;

} else if(x=="/")

{

return b/a;

}else if(x=="-")

{

return b-a;

}else if(x=="+")

{

return a+b;

}

}

void BuildTree(vector<string> vex)//通过后缀表达式建立二叉树

{

stack<TreeNode*>ss;//放后缀转树的栈

TreeNode *T = NULL;

for(int j=0;j<vex.size();j++)

{

if(IsNumber(vex[j]))

{

T = new TreeNode;

int n = stoi(vex[j]);

T->data  =n;

T->lchild =NULL;

T->rchild =NULL;

ss.push(T);

}else//操作符

{//pop出两个元素并处理

int a,b;

T = new TreeNode;

if(!ss.empty())

{

a= ss.top()->data;

T->rchild =ss.top();

ss.pop();

}

if(!ss.empty())

{

b= ss.top()->data;

T->lchild =ss.top();

ss.pop();

}

T->data = Deal(a,b,vex[j]);//处理加减乘除

ss.push(T);

}

}

PrintTree(T);

}

int main()

{

stack<string>st;//转后缀的栈

//<TreeNode>ss;//放后缀转树的栈

vector<string> vec;//存放处理后的中缀表达式

vector<string> vex;//存放后缀表达式

//string str="2*(70-2)+50*20+80";

string str="1+((2+3)*4)-5";//12 3 + 4 * + 5 –

GetString(vec,str);//把每个字符放进vec,因为有两位数以上的数字,这个方法就是解决这个问题,把每个部分都放进vector

//以下算法为中缀转后缀

for(int i=0;i<vec.size();i++)//小心这几个if else if 是先后顺序的,先过滤掉数字,过滤掉"("")",还有栈为空必须在比较优先级之前,否则栈为空没有栈顶就报错

{

if(vec[i]=="("){//放进栈

st.push(vec[i]);

}

else if(vec[i]==")")//找到最近的那个(,并输出括号中符号

{

string top = st.top();

while(!st.empty()&&top!="(")

{

cout<<top<<" ";

vex.push_back(top);

st.pop();

top = st.top();

}

st.pop();//注意别忘了,要把"("也Pop出去

}else if(IsNumber(vec[i]))//是数字直接输出

{

vex.push_back(vec[i]);

cout<<vec[i]<<" ";

}else if(st.empty())//栈是空的,直接进栈

{

st.push(vec[i]);

}else if(!st.empty()){//栈不为空,则把字符和栈顶比较

if(Priority(st.top()[0],vec[i][0])!=-1)//栈顶大或者等于,出栈 ****小心是栈顶大于或等于新来 符号就输出栈顶

{

while(!st.empty() &&Priority(st.top()[0],vec[i][0])!=-1)//把所有栈顶大于或等于的栈顶输出

{

string top = st.top();

st.pop();

vex.push_back(top);

cout<<top<<" ";

}

st.push(vec[i]);//把新来的字符放进栈

}else

{

st.push(vec[i]);//其他符号直接放进栈

}

}

}

while(!st.empty())//输出栈中的内容

{

vex.push_back(st.top());

cout<<st.top()<<" ";

st.pop();

}

cout<<endl;

BuildTree(vex);

}

1-2011-统计首字母相同的单词

#include<iostream>

#include<vector>

#include<algorithm>

 

using namespace std;

 

GetWord(vector<string>&vec,string str)

{

int pos;

for(int i=0;i<str.size();i++)

{

if(str[i]==' ')

{

string temps = str.substr(pos,i-pos);

pos=i+1;

vec.push_back(temps);

}

}

string temps = str.substr(pos);

vec.push_back(temps);

}

int main()

{

string str = "temp temper mop mort morning";

vector<string>vec;

GetWord(vec,str);

//去重复元素

vec.erase(unique(vec.begin(),vec.end()),vec.end());

for(int i=0;i<vec.size();i++)

{

int num=0;

for(int j=0;j<vec.size();j++)

{

char te = vec[i][0];

char mp = vec[j][0];

if(te==mp)

{

num++;

 }

}

cout<<vec[i]<<" "<<num<<endl;

}

}

2-2011-领导关系

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

/*

3. 给一个字符串(aaaa(bbbb(cccc,dddd),eeee(ffff)))该字符串

表明的是各人的层次关系

比如aaaa是bbbb和eeee的领导,bbbb是cccc和dddd的领导

现输入一个名称,比如ffff,要求输出其领导关系

输出:aaaa>eeee>ffff

*/

 /*

//(aaaa(bbbb(cccc,dddd),eeee(ffff)))

   //top  3    2    1         0     1

   如ffff

   在top==1 && 字符为'('时,处理字符串,在结果字符串中:加入eeee> ,变成eeee>ffff

   在top==2 && 字符为'('时,处理字符串,在结果字符串中:加入aaaa>,变成aaaa>eeee>ffff

   top==3时,满足,这里不写出来,因为后面我们会去掉

   同理:

    如eeee

//(aaaa(bbbb(cccc,dddd),eeee(ffff)))

   //top  2    1    0         1    

   在top==1 && 字符为'('时,处理字符串,在结果字符串中:加入aaaa> ,变成aaaa>ffff

   同理top==2不写出来

    */

int main()

{

string str1, str2, str="";

vector<string> vc;

str1="(aaaa(bbbb(cccc,dddd),eeee(ffff)))";

str2="ffff";

int tag=0;

int pos = str1.find(str2);

str.append(str2);

int count=0;//领导的长度

int index=0;

int number=0;//和tag搭配使用,当tag = 1+number时候就是遇到领导的时候

 

for(int i=pos;i>=0;i--){//思路,处理字符串,匹配括号,截取字符串 联想到括号匹配,这里对栈的处理进行了变形

if(str1[i]==')'){//给括号标号

tag--;

}else if(str1[i]=='('){

tag++;

}

if(index!=0){

if(str1[i]==',' or str1[i]=='('){

//index是包括领导的长度,所以要减去领导长度,截取出领导

string s = str1.substr(index-count, count);

cout<<s<<" ";

str.insert(0,s);

count=0;

index=0;

number++;//第几个领导

}else{

count++;//计算领导长度

}

}

if(str1[i]=='(' and tag==number+1){//tag==number是关键思想

str.insert(0,">");

index = i;//Index记录的是领导后面的一个(或者,

}

}

//cout<<str<<endl;

cout<<str.substr(1)<<endl;//最后多加了一个>

    return 0;

}

3-2011-单词排序

#include<iostream>

#include<vector>

#include<algorithm>

 

using namespace std;

 

GetWord(vector<string>&vec,string str)

{

int pos;

for(int i=0;i<str.size();i++)

{

if(str[i]==' ')

{

string temps = str.substr(pos,i-pos);

pos=i+1;

vec.push_back(temps);

}

}

string temps = str.substr(pos);

vec.push_back(temps);

}

int main()

{

string str = "btemp atemper imop pmort morning";

vector<string>vec;

GetWord(vec,str);

//去重复元素

//vec.erase(unique(vec.begin(),vec.end()),vec.end());

sort(vec.begin(),vec.end());

for(int i=0;i<vec.size();i++)

{

cout<<vec[i]<<" ";

}

}

4-2011-表达式中截取数字主要针对两位数以上的数字

#include<iostream>

#include<stack>

#include<vector>

#include<ostream>

void GetString(vector<string>&vec,string str){

  //vector<string> vec;

  int pos=0;

  string test="";

  //2*(70-20)+50*20

  for(int i=0;i<str.size();i++)

  {

  if(judge(str[i]) && !judge(str[i+1]))//该字符是数字,后一个是符号 ,则把数字部分截取出来

 {

  string temp = str.substr(pos,i-pos+1);//截取数组部分

  if(temp!="")

  {

  test.append(temp);

  vec.push_back(temp);

}

}

else if(judge(str[i]) && judge(str[i+1]))//前后是数字部分 ,继续计算数字的长度

{

pos = i;

}else //前后都是字符,则pos往后移动

{

string s(1,str[i]);//把单个字符转为字符串。需要头文件ostream

vec.push_back(s);

pos =i+1;

}

}

 }

 int main()

{

vector<string> vec;

GetString("2*(70-2)+50*20");

}

1-2012-学生对象的插入删除

#include<iostream>

#include<vector>

#include<algorithm>

#define Max 100

using namespace std;

class Student{

public:

 int id;

 string name;

 char sex;

 int age;

Student(){

this->id = NULL;

this->name = "";

this->sex = NULL;

this->age = NULL;

}

Student(int id,string name,char sex,int age)

{

this->id = id;

this->name = name;

this->sex = sex;

this->age = age;

}

int GetId() const {

        return this->id;

    }

    void SetId(int id) {

        this->id = id;

    }

    string GetName(){

        return this->name;

    }

    void SetName(int name) {

        this->name = name;

    }

    int GetAge() const {

        return this->age;

    }

    void SetAge(int age) {

        this->age = age;

    }

    char GetSex() {

        return this->sex;

    }

    void SetSex(int sex) {

        this->sex = sex;

    }

};

bool Compare(Student x,Student y)

{

 

//return x.GetId() > x.GetId();

return x.id > y.id;

}

void GetInfo(string str,string &id,string &name,char &sex,int &age)

{

int k=1;

int pos=0;

for(int i=0;i<str.size();i++)

{

if(str[i]==',')

{

switch(k)

{

case 1:

{

 id = str.substr(0,i);

//id = stoi(tempid);

k++;pos = i+1;break;

}

case 2:

{name = str.substr(pos,i-pos);

k++;pos = i+1;break;

}

case 3:

{

sex = str[i-1];

k++;pos = i+1;break;

}

}

}

}

string tempage = str.substr(pos);

age = stoi(tempage);

}

int main()

{

string info;

int k=0;

vector<Student>vec;

while(getline(cin,info))

{

 

string oid;

string sname;

char ssex;

int sage;

if(info[0]=='I')//插入

{

GetInfo(info,oid,sname,ssex,sage);

string tempid = oid.substr(1);

int id = stoi(tempid);

Student stu(id,sname,ssex,sage);

vec.push_back(stu);

k++;

}

else//删除

{

string tempid = info.substr(1);

int id = stoi(tempid);

for(int i=0;i<k;i++)

{

if(vec[i].id==id)

{

vec.erase(vec.begin()+i);

k--;

}

}

}

sort(vec.begin(),vec.end(),Compare);

vector<Student>::iterator it;

for(it = vec.begin(); it != vec.end(); ++it)

{

cout<<(*it).id<<" ";

cout<<(*it).name<<" ";

cout<<(*it).age<<" ";

cout<<(*it).sex<<endl;

}

}

}

2-2012-数字排序

#include<iostream>

#include<vector>

#include<algorithm>

using namespace std;

void GetNumber(string str)

{

vector<int>vec;

int size = str.size();

int pos =0;

for(int i=0;i<size;i++)

{

if(str[i]==',')

{

string te=str.substr(pos,i-pos);

pos =i+1;

int num =stoi(te);

vec.push_back(num);

}

}

string te=str.substr(pos);

int num =stoi(te);

vec.push_back(num);

sort(vec.begin(),vec.end());

for(int j=0;j<vec.size()-1;j++)

{

cout<<vec[j]<<",";

}

cout<<vec[vec.size()-1];

cout<<endl;

}

int main()

{

string str="1,2,5,7,9,10,45,67,24,26";

//while(getline(cin,str))

//{

GetNumber(str);

//}

}

3-2012-后序中序确定树输出前序

#include<iostream>

#include<vector>

#include<algorithm>

using namespace std;

struct TreeNode{

char data;

TreeNode *left,*right;

}Tree;

TreeNode* Create(string str1,string str2)//后序+中序

{

if(str1.size()==0)

{

return NULL;

}

char end = str1[str1.size()-1];//根节点

//cout<<end;

int pos =str2.find(end);

TreeNode *p = new TreeNode();

p->data = end;

int rithtlen =str2.size()-pos-1;//中序右边长度

int leftlen = str2.size()-pos;//中序左边长度

p->right = Create(str1.substr(str1.size()-rithtlen-1,rithtlen),str2.substr(pos+1)

);

p->left = Create(str1.substr(0,pos),str2.substr(0,pos));

return p;

}

void Preorder(TreeNode* T)

{

if(T==NULL)

{

return;

 

}

printf("%c",T->data);

Preorder(T->left);

Preorder(T->right);

return ;

}

int main()

{

string str1="CHBEDA";

string str2="CBHADE";

//while(cin>>n)

//{

int pos=0;

TreeNode* root =Create(str1,str2);

Preorder(root);

printf("\n");

 

//}

return 0;

}

1-2013-最小公约数公倍数

#include<iostream>

using namespace std;

int main()

{

int m=15;

int n=20;

int z=m;

if(m<n)

{

int temp =m;

m = n;

n =temp;

}

int q=m;

int p=n;

while(m%n!=0)

{

z = m%n;

m = n;

n = z;

}

cout<<"公约数是"<<z<<endl;

cout<<"公倍数是"<<p*q/z<<endl;

}

2-2013-字符串排序

#include<iostream>

#include<vector>

#include<algorithm>

using namespace std;

int main()

{

string str;

while(getline(cin,str))

{

vector<string>vec;

int size = str.size();

int j = 0;

for(int i=0;i<size;i++)

{

if(str[i]==' ')

{

string temp = str.substr(j,i-j);

j = i+1;

vec.push_back(temp);

}

}

string temp = str.substr(j);

vec.push_back(temp);

// vector<string>::iterator it;

// for(it=vec.begin();it!=vec.end();it++)

// {

// cout<<*it<<" ";

// }

// cout<<endl;

sort(vec.begin(),vec.end());

vector<string>::iterator tt;

for(tt=vec.begin();tt!=vec.end();tt++)

{

cout<<*tt<<" ";

}

cout<<endl;

}

}

3-2013-运算符优先级

#include<iostream>

#include<stack>

using namespace std;

int  Priority(char s1,char s2)

{//判断两个运算符s1,s2的优先顺序,

//若s1优先则返回>,若s2优先则返回<,若s1,s2相同则返回=

char f;

int p;

switch(s2)

{

case '+':

case '-':

if(s1=='*'||s1=='/')p=-1;

else if(s1=='+'||s1=='-')p=0;break;

case '*':

case '/':

if(s1=='+'||s1=='-')p= 1;

else if(s1=='*'||s1=='*')p= 0;break;

}

return p;

}

void  Reverse(string all)

{

string temp;

for(int i=all.size()-1;i>-1;i--)

{

temp +=all[i];

}

cout<<temp;

}

int main()

{

// cout<<Priority('*','+')<<endl;

// cout<<Priority('+','+')<<endl;

// cout<<Priority('-','/')<<endl;

Reverse("1234");

return 0;

 

 }

4-2013-二叉树中序转前序+运算符优先级

#include<iostream>

#include<stack>

#include<algorithm>

using namespace std;

int  Priority(char s1,char s2)

{

char f;

int p;

switch(s2)

{

case '+':

case '-':

if(s1=='*'||s1=='/')p=-1;//+ * 返回-1,栈顶优先级大

else if(s1=='+'||s1=='-')p=0;break;

case '*':

case '/':

if(s1=='+'||s1=='-')p= 1;

else if(s1=='*'||s1=='*')p= 0;break;

case '(':

case ')':

p=0;break;

}

return p;

}

bool Alphabet(char c)//判断是不是字母

{

for(int i=0;i<26;i++)

{

char te ='a'+i;

if(c==te)

{

return true;

}

}

return false;

}

string Reverse(string all)//逆序字符串

{

string temp;

for(int i=all.size()-1;i>-1;i--)

{

temp +=all[i];

}

return temp;

}

int main()

{

/*

算法:

从右开始,是字符就添加进字符串,是右括号进进栈,如果是运算符,

和栈顶比较,栈顶优先级大或者相等就进栈。栈顶优先级小就出栈。出栈的组成字符串,最后逆转字符串输出。

*/

stack<char>tag;

string str="a+b*(c-d)-e/f";

cout<<str<<endl;

string all;

for(int i=str.size()-1;i>0;i--)

{

if(Alphabet(str[i]))

{

all +=str[i];

}

else if(str[i]==')')

{

tag.push(str[i]);

}

else if(str[i]=='(')

{

char c = tag.top();

while(c!=')'&&!tag.empty())

{

 

tag.pop();

all +=c;

c = tag.top();

}

tag.pop();

}else if(tag.empty()||Priority(str[i],tag.top())==-1 || Priority(str[i],tag.top())==0)

{

//栈顶优先级大就进栈

//栈为空进站

//优先级相同进站

tag.push(str[i]);

}else if(Priority(str[i],tag.top())==1)

{

//栈顶优先级小就出栈

char c = tag.top();

tag.pop();

all +=c;

tag.push(str[i]);

}

}

while(!tag.empty())//把栈中剩余的元素输出

{

char c = tag.top();

tag.pop();

all +=c;

}

cout<<Reverse(all);//反转字符串

return 0;

}

1-2014-输出三个最近使用文件有重复就不打乱文件顺序

#include<iostream>

#include<stack>

#include<queue>

using namespace std;

bool FindHistory(stack<int>st,int n)

{

int size = st.size();

for(int i=0;i<size&&i<3;i++)

{

int temp = st.top();

st.pop();

if(temp==n)

{

return true;

}

}

return false;

}

int main()

{

stack<int>st;

int n;

cout<<"输入:";

while(cin>>n)

{

cout<<"输出:";

if(FindHistory(st,n))

{

stack<int>sq =st;

int size = sq.size();

for(int i=0;i<size&&i<3;i++)

{

int temp = sq.top();

sq.pop();

cout<<temp<<" ";

}

//cout<<endl;

cout<<"输入:";

}else

{

st.push(n);

stack<int>sq =st;

int size = sq.size();

for(int i=0;i<size&&i<3;i++)

{

int temp = sq.top();

sq.pop();

cout<<temp<<" ";

}

//cout<<endl;

cout<<"输入:";

}

}

 }

2-2014-输出最近使用三个文件

#include<iostream>

#include<stack>

#include<queue>

using namespace std;

int main()

{

stack<int>st;

int n;

cout<<"输入:";

while(cin>>n)

{

int num=0;

st.push(n);

cout<<"输出:";

stack<int>sq =st;

int size = sq.size();

if(size<3)

{

for(int i=0;i<size;i++)

{

int temp = sq.top();

sq.pop();

cout<<temp<<" ";

}

cout<<endl;

cout<<"输入:";

}

else

{

for(int i=0;i<3;i++)

{

int temp = sq.top();

sq.pop();

cout<<temp<<" ";

}

cout<<endl;

cout<<"输入:";

cout<<endl;

}

}

 }

3-2014-求广义表的深度

#include<iostream>

#include<stack>

#include<queue>

using namespace std;

int main()

{

//stack<char>st;

stack<char>st;

int n;

string str="((c,((d.(e)),f,h),g)";

int max=0;

for(int i=0;i<str.size();i++)

{

if(str[i]=='(')

{

st.push(str[i]);

if(st.size()>max)

{

max = st.size();

}

}else if(str[i]==')')

{

int size = st.size();

for(int i=0;i<size;i++)

{

int temp =st.top();

st.pop();

if(temp==')')

{

break;

}

}

}

}

cout<<"最大是: "<<max;

 }

1-2015-正方形打印空心菱形

#include<stdlib.h>

#include<stdio.h>

int main()

{

    int i,j;

    int test=11;//只能输入奇数

    int n=(test+1)/2;

    //单独输出第一行

    for(int k=0;k<2*n-1;k++)

    {

     printf("*");

}

printf("\n");

 

//上半个长方形

    for(i = 1; i < n; i++)//从第二行开始,打印一半的行数

    {

     int temp =n-1 - i;//输出直角三角形

        for(j = 0; j <= temp; j++)

        {

            printf("@");

        }

        for(j = 0; j < 2 * i - 1; j++)//输出正等腰三角形

        {

            printf(" ");

        }

        for(j = 0; j <= temp; j++)//输出后半个三角形。别想太复杂 ,和前面个三角形代码一样

        {

            printf("&");

        }

        printf("\n");    

    }

    //输出下半个长方形

    for(i = 0; i < n-2; i++)//最后一行,和第一行一样,都是直接输出完整一行,就减去2,头一行,尾巴一行

    {

     int temp = i + 1;

        for(j = 0; j <= temp; j++)//输出直角梯形 ,第一行输出两个

        {

            printf("O");

        }

        

        for(j = 0; j < 2 * n-2*i-5; j++)//输出空格的倒三角,根据图形去推理的的公式

        {

            printf(" ");

        }

        for(j = 0; j <=temp; j++)//和前一个直角梯形一样的代码

        {

        

         printf("*");

        }

        printf("\n");    

    }

    //最后一行完整输出

    for(int k=0;k<2*n-1;k++)

    {

     printf("*");

}

}

2-2015-输出限制字符长度的全排列

#include <stdio.h>

#define M 256

using namespace std;

char buf[M] = {0};

void fun(int n, int size,string str)//形参n表示当前字符为第n个字符,size表示字符的个数

{

if (n > size)

{

buf[n-1] = '\0';

puts(buf);//输出字符串并换行

return;

}

for (int i = 0; i < str.size(); i++)

{

buf[n-1] = str[i];//不停的覆盖,就实现了更新每个位置的字符

fun(n+1, size,str);

}

return;

}

int main()

{

int n = 2;

string str="abc";

fun(1, n,str);//第一个参数始终是1,表示从第一个字符开始处理

return 0;

}

3-2015-火车输出序列堆栈的使用

#include<iostream>

#include<stack>

#include<queue>

 

using namespace std;

int main()

{

stack<int>C;

queue<int>B;

queue<int>D;

stack<int>A;

int n=6;

for(int i=n;i>0;i--)

{

A.push(i);

}

while(!A.empty()||!B.empty()||!C.empty())

{

int trainA = A.top();

A.pop();

 

if(trainA%2==0)

{

if(C.size()<3||C.size()==3)

{

C.push(trainA);

cout<<trainA<<":A->C ";

}

else{

int trainC = C.top();

C.pop();

//A.push(trainC);

cout<<trainA<<":C->A ";

}

}else

{

if(B.size()<3||B.size()==3)

{

B.push(trainA);

cout<<trainA<<":A->B ";

}

else

{

int trainB = B.front();

B.pop();

//D.push(trainB);

cout<<trainB<<":B->D ";

}

 

}

while(!B.empty()&& A.empty() )

{

int trainB = B.front();

B.pop();

//D.push(trainB);

cout<<trainB<<":B->D ";

}

while(!C.empty()&&A.empty())

{

int trainC = C.top();

C.pop();

//D.push(trainB);

cout<<trainC<<":C->A ";

}

}

 }

4-2015-单词排序不区分大小写

#include<iostream>

#include<algorithm>

#include<string.h>

using namespace std;

struct Node{

string a,b;

};

int compare(Node x,Node y)

{

return x.b<y.b;

}

int main()

{

string str[7] = {"Information","Info","Inform","info","Suite","suite","suit"};

for(int i=0;i<7;i++)

{

cout<<str[i]<<" ";

}

cout<<endl;

Node ss[7];

for(int i=0;i<7;i++)

{

ss[i].a=str[i];//a存原来的单词

ss[i].b=str[i];//b存转换成全部是小写的单词

for(int j=0;j<str[i].size();j++)

{

if(ss[i].b[j]>='A'&&ss[i].b[j]<='Z')//把所有字母转换成小写字母

{

ss[i].b[j] +='a'-'A';

}

}

}

sort(ss,ss+7,compare);

for(int i=0;i<7;i++)

{

cout<<ss[i].a<<" ";

}

cout<<endl;

// char *a = "bBcDeF";

//    char *b = "AbCdEf";

//    int result = stricmp(a,b);

//    cout<<result<<endl;

}

1-2016-字符串中摘取数字

#include<iostream>

#include<string>

#include<vector>

using namespace std;

 

bool judgeA(char a)

{

for(int i=0;i<26;i++)

{

if((a=='a'+i)||(a=='A'+i))

{

return true;

}

}

return false;

}

int judgeN(string s)

{

for(int i=0;i<s.size();i++)

{

int temp =s[i]-'0';

for(int j=1;j<10;j++)

{

if(temp==j)

{

return i;

}

}

}

return -1;

}

void TailZero(string &s)

{

if(s.find('.')!=-1)//存在小数点

{

int flag =1;//是连续的0

for(int i=s.size()-1;i>0;i--)

{

if(s[i]=='0' && flag ==1)

{

char tt =s[i];

//cout<<tt<<" ";

s.erase(i);

flag ==1;

}else

{

flag =0;

}

}

}

}

void NumberCon(vector<string>&vec,string s)

{

//vector<string>vec;

int pos=0;

//0+123

for(int j=1;j<s.size();j++)

{

if(s[j]=='-'||s[j]=='+')

{

string temp = s.substr(pos,j-pos);

pos = j;

vec.push_back(temp);

}

}

string tt = s.substr(pos);

vec.push_back(tt);

 

}

void HeadZero(string &s)

{

int pos =judgeN(s);

if(pos==-1)//字符串中没有数字

{

s='0';

}

else

{

int t=-1;

int p1 =s.find('+');

int p2 =s.find('-');

if(p1!=-1)

{

t = p1;

}

else

{

t = p2;

 

}

for(int k=1;k<pos;k++)

{

s.erase(t+1,1);//小心,一次erase,长度就减一了 ,erase必须是两个参数,第一个是删除的位置,第二个是长度

//cout<<s<<endl;

}

//cout<<s<<endl;

}

}

void Deal(vector<string>&vec,string s)//处理字符串

{

vector<string>vex;

NumberCon(vex,s);

for(int i=0;i<vex.size();i++)

{

// [Error] invalid conversion from 'char' to 'const char*' [-fpermissive]

string temp = *(vex.begin()+i);

//数字前的零

HeadZero(temp);

//处理尾巴存在零

TailZero(temp);

//处理有+45+34.3402的这种字符串,本来应该是两个数字,要分开

vec.push_back(temp);

}

 

 

}

int main()

{

vector<string>vec;

//string str="2.3ABC0-2.3+004.5000ABC+000123.300";

//string str ="002.3+3000+34A+00.3000";

//string str="2.3ABC0-2.3";

//string str="2.3ABC0-2.3+004500";//2.3 0 -2.3 +45

string str="+004.500";

string temp="";

string last="";

int flag =0;//没有出现过+ -

for(int i=0;i<str.size();i++)

{

//cout<<str[i]<<endl;

//&&!judgeS(str[i])

 

if(!judgeA(str[i])){//不是字母

 

temp +=str[i];  

}

else if((temp!=last) && (temp !=""))

{

flag=0;

last = temp;

Deal(vec,temp);

//NumberCon(temp);

//vec.push_back(temp);

}

else{

temp ="";

}

}

 

if(temp!="")

{

//cout<<temp<<endl;

Deal(vec,temp);

}

cout<<"输出: "<<endl;

for(int j=0;j<vec.size();j++)

{

cout<<vec[j]<<endl;

}

}

2-1016-指定精度计算PI值

#include<iostream>

#include<string>

#include <sstream>

using namespace std;

int  main()

{

float pi=0;

float accurate =  0.01;

//while(cin>>accurate)

//{

float n=4;

float t =3;

float temp=0;

int k=1;

pi = n;

while((n/t)>accurate)

{

if(k%2==0)

{

pi += n/t;

}else

{

pi -= n/t;

}

t +=2;

k++;

//cout<<pi<<endl;

}

cout<<k<<endl;

cout<<pi<<endl;

//}

}

3-2016-数字转字符串

#include<iostream>

#include<string>

#include<sstream>

using namespace std;

void judge(double a)

{

ostringstream mos;//构造字符串流

mos<<a;

string l=mos.str();//double转字符串

//string l=to_string(a);

 

int pos = l.find('.');

cout<<l<<endl;

cout<<pos;

//return l.length()-pos-1;

}

int main()

{

judge(0.001);

}

4-2016-链表存奇偶数

#include<iostream>

#include<string>

#include <vector>

using namespace std;

typedef struct LNode{

int data;

struct LNode * next;

}LNode,*LinkList;

string trim(string &s)

{

for(int i=0;i<s.size();i++)

{

if(s[i]==' ')

{

s.erase(i,1);

}

}

return s;

}

void GetNumber(string s,vector<int>&vec)

{

int j=0;

for(int i=0;i<s.size();i++)

{

if(s[i]==' ')

{

string temp= s.substr(j,i-j);

j=i+1;

int number = stoi(temp);

//vector<int>vec;

vec.push_back(number);

}

}

string te=s.substr(j);

int num = stoi(te);

vec.push_back(num);//最后一个子串加进去

}

void PrintL(LinkList L)

{

LinkList t = L->next;

while(t!=NULL)

{

cout<<t->data<<" ";

t= t->next;

}

cout<<endl;

}

void Insert(LinkList &L,int n)

{

LNode *p,*temp;

p = L;

if(p->next==NULL)

{

temp =(LNode*)malloc(sizeof(LNode));

temp->data = n;

L->next = temp;

temp->next = NULL;

//cout<<"头插入成功"<<endl;

return;

}

while((p->next!=NULL)&&(p->next->data>n))

{

p = p->next;

}

temp =(LNode*)malloc(sizeof(LNode));

temp->data = n;

temp->next = p->next;

p->next = temp;

//cout<<n<<"插入成功"<<endl;

return ;

}

int  main()

{

string str="9 8 7 6 5 4 3 2 1";

//cout<<"字符串大小是"<<str.size()<<endl;

//string str="246137";

//string str;

//while(getline(cin,str))

//{

LinkList Jlist =(LinkList)malloc(sizeof(LinkList));

Jlist->next=NULL;

LinkList Olist =(LinkList)malloc(sizeof(LinkList));

Olist->next=NULL;

vector<int>vec;

GetNumber(str,vec);

for(int i=0;i<vec.size();i++)

{

int t = vec[i];

//cout<<t<<endl;

if(t%2!=0)

{

Insert(Jlist,t);

//cout<<"奇数是"<<t<<endl;

}else

{

Insert(Olist,t);

//cout<<"偶数是"<<t<<endl;

}

}

PrintL(Jlist);

PrintL(Olist);

//}

// string str ="10 21 3 46 5 6 7";

// vector<int>vec;

// GetNumber(str,vec);

// for(int j=0;j<vec.size();j++)

// {

// cout<<vec[j]<<endl;

// }

// cout<<str<<endl;

// trim(str);

// cout<<str<<endl;

}

5-2016-动态开辟数组数目

#include<iostream>

#include<string>

#include<algorithm>

using namespace std;

const int MAX=100;

 

struct student{

string name;

string id;

int score[MAX];

int nopass;//没有及格数

};

student arr[MAX];

void init(int n,int m)

{

for(int i=0;i<n;i++)

{

arr[i].nopass=0;

int num=0;

for(int k=0;k<m;k++)

{

if(arr[i].score[k]<60)

{

num++;

}

}

cout<<arr[i].name<<" "<<num<<endl;

arr[i].nopass=num;

}

}

bool Compare(student x,student y)

{

return x.nopass>y.nopass;

}

int main()

{

int n=5;

int m=3;

arr[0].name="飞机";arr[0].score[0]=70;arr[0].score[1]=80;arr[0].score[2]=91;

arr[1].name="轮船";arr[1].score[0]=20;arr[1].score[1]=20;arr[1].score[2]=20;

arr[2].name="汽车";arr[2].score[0]=60;arr[2].score[1]=80;arr[2].score[2]=90;

arr[3].name="单车";arr[3].score[0]=50;arr[3].score[1]=50;arr[3].score[2]=60;

arr[4].name="卡卡";arr[4].score[0]=30;arr[4].score[1]=60;arr[4].score[2]=60;

init(n,m);

sort(arr,arr+n,Compare);

for(int i=0;i<n;i++)

{

cout<<arr[i].name<<endl;  

}

 

}

6-2016递归求字符串的长度

#include<iostream>

#include<string>

#include <sstream>

using namespace std;

int forlength(string s,int i)

{

if(s[i]=='\0')

{

return 0;

}

else

{

return 1+forlength(s,i+1);

}

}

int  main()

{

string str;

while(cin>>str)

{

cout<<forlength(str,0)<<endl;

}

}

7-2016-单词排序

#include<iostream>

#include<vector>

#include<algorithm>

using namespace std;

GetWord(vector<string>&vec,string str)

{

int pos;

for(int i=0;i<str.size();i++)

{

if(str[i]==' ')

{

string temps = str.substr(pos,i-pos);

pos=i+1;

vec.push_back(temps);

}

}

string temps = str.substr(pos);

vec.push_back(temps);

}

int main()

{

string str = "btemp atemper imop pmort morning";

vector<string>vec;

GetWord(vec,str);

//去重复元素

//vec.erase(unique(vec.begin(),vec.end()),vec.end());

sort(vec.begin(),vec.end());

for(int i=0;i<vec.size();i++)

{

cout<<vec[i]<<" ";

}

}

1-2017-统计学生没及格输出

#include<iostream>

#include<string>

#include<algorithm>

using namespace std;

const int MAX=100;

struct student{

string name;

int c1;

int c2;

int c3;

};

student arr[MAX];

student didnt[MAX];

bool Compare(student x,student y)

{

int  a=x.c1+x.c2+x.c3;

int  b=y.c1+y.c2+y.c3;

return a>b;

}

int main()

{

int n=5;

//while(cin>>n)

//{

// for(int i=0;i<n;i++)

// {

// cin>>arr[i].name>>arr[i].c1>>arr[i].c2>>arr[i].c3;

//

// }

arr[0].name="飞机";arr[0].c1=70;arr[0].c2=80;arr[0].c3=91;

arr[1].name="轮船";arr[1].c1=20;arr[1].c2=20;arr[1].c3=20;

arr[2].name="汽车";arr[2].c1=60;arr[2].c2=70;arr[2].c3=80;

arr[3].name="单车";arr[3].c1=50;arr[3].c2=50;arr[3].c3=50;

arr[4].name="卡卡";arr[4].c1=30;arr[4].c2=60;arr[4].c3=60;

int k=0;

for(int i=0;i<n;i++)

{

if(arr[i].c1<60||arr[i].c2<60||arr[i].c3<60)

{

didnt[k]=arr[i];

k++;

}

}

sort(didnt,didnt+k,Compare);

for(int i=0;i<k;i++)

{

cout<<didnt[i].name<<endl;  

}

//}

}

2-2017-限制字符串的全排列

#include <stdio.h>

#define M 256

using namespace std;

char buf[M] = {0};

void fun(int n, int size,string str)//形参n表示当前字符为第n个字符,size表示字符的个数

{

if (n > size)

{

 

buf[n-1] = '\0';

puts(buf);//输出字符串并换行

return;

}

for (int i = 0; i < str.size(); i++)

{

buf[n-1] = str[i];//不停的覆盖,就实现了更新每个位置的字符

fun(n+1, size,str);

}

return;

}

int main()

{

int n = 2;

string str="abc";

fun(1, n,str);//第一个参数始终是1,表示从第一个字符开始处理

return 0;

}

3-2017-字符串中的元素排序

#include<iostream>

#include<vector>

#include<string>

#include<algorithm>

using namespace std;

 int main()

 {

  vector<string>vec;

  string str="ac cf bgn oo qq pp";

  //cout<<str;

  int num =0;

  int j=0;

  for(int i=0;i<str.size();i++)

{

  if(str[i]==' ')

 {

  string tt;

  tt=str.substr(j,i-j);//逐个把子串加进去

  vec.push_back(tt);

  j=i+1;

 }  

}

string te=str.substr(j);

vec.push_back(te);//最后一个子串加进去

sort(vec.begin(),vec.end());

for(int k=0;k<vec.size();k++)

{

cout<<vec[k]<<endl;

}

 }

4-2017-身份证校验码

#include<iostream>

using namespace std;

int main()

{

char ID[]={'1','0','X','9','8','7','6','5','4','3','2'};

//cout<<ID[0]<<endl;

//cout<<ID[1]<<endl;

int Wi[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};

//string Ai="110130197606175317";

string Ai="11020019750117522X";

//cin>>Ai;

int S=0;

for(int i=0;i<Ai.size()-1;i++)

{

int temp = Ai[i]-'0';

S +=temp*Wi[i];

}

int Y= S%11;

cout<<"Y="<<Y<<endl;

//char result = ID[Y];

cout<<"result="<<ID[Y]<<endl;

if(ID[Y]==Ai[17])

{

cout<<"Yes";

}

else

{

cout<<"No";

}

 }

5-2017-全排列

#include<iostream>

#include<list>

#include<vector>

#include<algorithm>

 

//算法思想,参考博客

//https://blog.csdn.net/weixin_43145361/article/details/89061051

using namespace std;

vector<string>all;

void traverse(vector<char>a,vector<char>b)//递归实现博客中所描述的树

{

if(a.size()>0)//a是第一个原来的字符串,b是排列的字符串

{

for(int i =0;i<a.size();i++)

{

b.push_back(a[i]);//逐个把a中字符放入b中

a.erase(a.begin()+i);//就把a中元素移走

traverse(a,b);//递归去排列元素

a.insert(a.begin()+i,b[b.size()-1]);//把拿出来那个元素放回a中

b.erase(b.begin()+b.size()-1);//就把b中的这个元素移走

}

}

else

{

string temp;

vector<char>::iterator it;

for(int i=0;i<b.size();i++)//把vector中排列组成一个字符串

{

temp +=b[i];

//cout<<b[i]<<" ";

}

all.push_back(temp);//放入全局的vector,后面要进行重复的字符串删除处理

}

}

int main()

{

vector<char>vec;

vector<char>result;

string str="abc";

for(int j=0;j<str.size();j++)//把字符串放入vector

{

vec.push_back(str[j]);

}

traverse(vec,result);

sort(all.begin(),all.end());

all.erase(unique(all.begin(),all.end()),all.end());//51,52行代码是处理重复的字符串

vector<string>::iterator it;

for(it=all.begin();it!=all.end();++it)//输出全排列字符串

{

cout<<*it<<endl;

}

 }

6-2017-求字符串的全部子串

#include<iostream>

#include<map>

#include<string>

using namespace std;

int main()

{

//https://blog.csdn.net/weixin_43871369/article/details/90523139

string str;

while(cin>>str)

{

map<string,int>number;

for(int i =0;i<=str.size();i++)

{

for(int j=0;j<i;j++)

{

string key=str.substr(j,i-j);//关键点,是截取j<i的所有组合,比如从0-1,0-2,

cout<<key<<endl;

//number[key]++;

}

}

 }

return 0;

 }

7-2017-判断n是否在n的平方最右边

#include<iostream>

#include<string>

#include<stdlib.h>

using namespace std;

int change(int n)

{

int num=0;

while(n)

{

n = n/10;

num++;

}

return num;

 }

 int main()

 {

  int n=1;

  //int m1= 123456;

//cout<<change(m1);

///while(cin>>n)

//{

int square = n*n;

int lenn=change(n);//计算数字n的长度

int lens=change(n*n);//计算数字n的平方的长度

char* a=new char[lenn];

char* b=new char[lens];

    itoa(n,a,10);//把n转为字符串

    itoa(square,b,10);////把n的平方转为字符串

  for(int i=0;i<lenn;i++)

  {

  int diff = lens-lenn;//右边对齐,开始比

  if(a[i]!=b[i+diff])

  {

  cout<<"No";

  return 0;

 }

 }

 cout<<"Yes"<<endl;

   

    return 0;

//}

// char* str=new char[n];

// itoa(n,str,10);

// cout<<str[0]<<" "<<str[1];

 

 }

8-2017-二分查找

#include<iostream>

using namespace std;

void BFind(int a[],int n,int m)

{

int low=0;

int high=n-1;

int count=0;

int mid;

while(low<=high)

{

count++;

mid=(low+high)/2;

if(a[mid]==m)

{

cout<<"第"<<mid+1<<"个元素为"<<m<<" 查找次数为"<<count<<endl;

return;

}

else if(a[mid]>m)

{

high = mid-1;

}else

{

low = mid+1;

}

}

cout<<"查找失败 比较次数是"<<count<<endl;

return;

 }

 int main()

 {

  int a[]={-90,-32,12,16,24,36,45,59,98,120};

  int n;

 

  while(cin>>n)

  {

  BFind(a,10,n);

 }

// BFind(a,10,24);

// BFind(a,10,120);

// BFind(a,10,6);

 }

9-2017-打印菱形

#include<iostream>

using namespace std;

int main()

{

int n=21;

int test =(n+1)/2;

for(int i=0;i<test;i++)

{

for(int j=0;j<test-i-1;j++)

{

cout<<" ";

}

for(int j=0;j<2*i+1;j++)

{

cout<<"*";

}

cout<<endl;

}

for(int i=0;i<test-1;i++)

{

for(int j=0;j<i+1;j++)

{

cout<<" ";

}

for(int j=0;j<n-2-2*i;j++)

{

cout<<"*";

}

cout<<endl;

}  

 }

10-2017-打印等腰三角形

#include<iostream>

using namespace std;

 int main()

 {

  int n=10;

  for(int i=1;i<=n;i++)

  {

  for(int j=1;j<=n-i;j++)

  {

  cout<<" ";

 }

  for(int j=1;j<=2*(i-1)+1;j++)

  {

  cout<<"*";

 }

 cout<<endl;

 }

 }

1-2018-求字符集交集

#include<iostream>

#include<string>

#include<vector>

#include<algorithm>

using namespace std;

 const int MAX =1000;

char len[MAX];

 int main()

 {

  string str1="bcdaopk",str2="abefpko";

//cin>>str1>>str2;

int k=0;

for(int i =0;i<str1.size();i++)

{

char t=str1[i];

if(str2.find(t)!=-1)

{

len[k]=t;

k++;

 }

}

sort(len,len+k);

for(int j=0;j<k;j++)

{

cout<<len[j];

}

cout<<endl;

 }

2-2018-求一个偶数是哪两个素数之和

#include<iostream>

#include<math.h>

#include<string>

using namespace std;

bool judgePrime(int n)//判断素数

{

int k=sqrt(n);

int i;

for(i=2;i<=k;i++)

{

if(n%i==0)

{

break;

}

}

if(i>k)

{

return true;

}

else

{

return false;

}

}

int main()

{

/*

算法:

1.t=n;n=n-1,去判断是不是素数

是:则再去判断 t-n是不是素数,是就满足条件

不是:n=n-2;继续去循环去判断n

 

*/

int n=10;//n是偶数

int t=n;

n--;//n是偶数,减一是奇数

int k =t/2;//只判断一半,比如n=10,则只需要计算到1~5的数字就够了,因为该题问的是一个偶数由那两个奇数组成。

while(n>=k)

{

if(judgePrime(n))

{

int m=t-n;//组成n的其中一个元素,比如t=10,这里的m=1,n=9;

if(judgePrime(m))//判断m是不是素数

{

cout<<t<<"="<<n<<"+"<<m<<endl;

}

 }

n=n-2;//奇数减去2还是奇数

}

return 0;

}

3-2018-奇偶数拆分为两个链表

#include<iostream>

#include<string>

#include<stdlib.h>

 

using namespace std;

/*

 *输入字符串,分别将偶数奇数拆分在两条链表上存储

 */

typedef struct Lnode{

    int data;//数据域

    struct Lnode *next;    //指针域

}Lnode,*Linklist;

void PrintL(Linklist L)

{

Linklist t = L->next;

while(t!=NULL)

{

cout<<t->data<<" ";

t= t->next;

}

cout<<endl;

}

void Insert(Linklist &L,int m){

    Lnode *p,*temp;

    p = L;

    if(p->next==NULL)

    {

     temp = (Lnode*)malloc(sizeof(Lnode));

temp->data= m;

temp->next = NULL;

L->next = temp;

return;

}

 

    while((p->next!=NULL)&&(p->next->data<m)){//查找插入位置 ,****注意条件 p->next!=NULL不能少

     p =p->next;

  }

temp = (Lnode*)malloc(sizeof(Linklist));

temp->data= m;

temp->next = p->next;

p->next = temp;

return;

}

int main()

{

Linklist h1 =  (Linklist)malloc(sizeof(Linklist));

h1->next =NULL;//偶数链表

Linklist h2 =  (Linklist)malloc(sizeof(Linklist));

h2->next=NULL;//存奇数链表

string str="246137";

//while(cin>>str)

for(int i=0;i<str.size();i++)

{

int number = str[i]-'0';//字符转整型

if(number%2==0)

{

cout<<"偶数= "<<number<<endl;/*****当number=4时候,调试就卡在这一行不走了******/

Insert(h1,number);

}else

{

cout<<"奇数= "<<number<<endl;

Insert(h2,number);

}

}

PrintL(h1);

PrintL(h2);

//}

}

4-2018-回文的判断

#include<iostream>

#include<stack>

#include<string>

using namespace std;

int main()

{

string str="abcCBA";

//cin>>str;

//while(cin>>str)

//{

stack<char>st;

int i=0;

for(;i<str.size()/2;++i)

{

st.push(str[i]);

}

if(str.size()%2!=0)

{

i++;

}

while(i<str.size())

{

char temp =st.top();

st.pop();

if(str[i]==temp||(str[i]==temp+32)||(str[i]+32==temp))//因为不知道谁是a,A.就都尝试在两边加32试试,如果是,说明是大小字母的关系

{

i++;

}

else

{

break;

}

}

if(st.empty())

{

cout<<"Yes"<<endl;

}

else

{

cout<<"No"<<endl;

}

//}

}

4-2018-打印梯形

#include<iostream>

using namespace std;

 int main()

 {

  int n=5;

  //while(cin>>n)

  //{

  for(int i=1;i<=n;i++)

  {

  for(int j=1;j<=n-i;j++)

  {

  cout<<" ";

}

for(int j=1;j<=2*i+n-2;j++)

/*

/比如n=4

i     j

第一行:3空格4*

第二行:2空格6* 

第三行:1空格8*

第四行:0空格10* 

刚好 j=2*i+n-2

*/

  {

  cout<<"*";

}

cout<<endl;

}

//}

 }

 

猜你喜欢

转载自blog.csdn.net/weixin_43935696/article/details/106037788