2010年机试真题

1.输入一串整数,输入命令排序!

输入a t在这串整数后面添加整数t,

输入c\m\n有n替换m,

输入d t删除t,

输入s排序。

#include

#include

#include

#include

using namespace std;

int main(){

vector data;

vector::iterator i;

string t;

cout<

cin>>t;

while(t!=”#”){

int r=0,j=0;

while(t[j]!=’\0′){

r=r*10+t[j]-‘0’;

j++;

}

data.push_back(r);

cin>>t;

}

//操作

cout<

while(cin>>t){

//添加的情况

if(t[0]==’a’){

int num;

cin>>num;

//在末尾添加数字

data.push_back(num);

}

//修改的情况

else if(t[0]==’c’){

int j=2,num1=0,num2=0;

//提取数字

while(t[j]!=’\\’){

num1=num1*10+t[j++]-‘0’;

}

j++;

while(t[j]!=’\0′){

num2=num2*10+t[j++]-‘0’;

}

//替换

for(i=data.begin();i!=data.end();i++)

if(*i==num1){

data.erase(i);

data.insert(i,num2);

}

}

//删除的情况

else if(t[0]==’d’){

int num;

cin>>num;

for(i=data.begin();i!=data.end();i++)

if(*i==num)

data.erase(i);

}

//排序的情况

else if(t[0]==’s’){

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

}

else{

cout<

}

//输出

for(i=data.begin();i!=data.end();i++)

cout<

cout<

}

return 0;

}

2.输入表达式,输出值。

即中缀表达式求值:先将中缀表达式转化为后缀表达式,然后再求值。

#include

#include

#include

#include

using namespace std;

/**

*输入中缀表达式,转化为计算机可以计算的后缀表达式,即逆波兰表达式。

*定义运算符的优先级次序依次是+、-、*、/、(、),权值越大,优先级越高

*在栈顶时的优先级别

*   int op_pri_s[6]={1,1,2,2,0,0};

*在字符串中的优先级别

*   int op_pri_q[6]={1,1,2,2,3,0};

*/

/**

* ()输入是英文的符号,记得调好输入法,我因为这个调了半个小时bug

*/

//判定栈顶优先级权值的函数

int psta(string opt){

char op[6]={‘+’,’-‘,’*’,’/’,'(‘,’)’};

int op_pri_s[6]={1,1,2,2,0,0};

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

if(opt[0]==op[i])

return op_pri_s[i];

}

//判定字符串中优先级权值的函数

int pstr(char opt){

char op[6]={‘+’,’-‘,’*’,’/’,'(‘,’)’};

int op_pri_q[6]={1,1,2,2,3,0};

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

if(opt==op[i])

return op_pri_q[i];

}

int main(){

stack s;

queue q;

string data;

cin>>data;

//转后缀表达式

int i=0;

while(data[i]!=’\0′){

string t=””;

//如果是运算符时

if(data[i]==’+’||data[i]==’-‘||data[i]==’*’||data[i]==’/’||data[i]=='(‘||data[i]==’)’){

//栈空,直接压栈

if(s.empty()){

t+=data[i++];

s.push(t);

t=””;

}

//栈顶运算符优先级较高

else if(psta(s.top())>=pstr(data[i])){

// ***可能多次弹栈,直到字符串的运算符,优先级较高

while(psta(s.top())>=pstr(data[i])){

if((data[i]==’)’&&s.top()==”(“))

break;

q.push(s.top());

s.pop();

//防止栈空,造成空指针异常

if(s.empty())

break;

}

//括号匹配的情况,!s.empty()防止栈空,造成空指针异常

if(!s.empty()&&data[i]==’)’&&s.top()==”(“){

i++;

s.pop();

}

else{

t+=data[i++];

s.push(t);

t=””;

}

}

//字符串运算符优先级较高

else{

t+=data[i++];

s.push(t);

t=””;

}

}

//如果是数字

else

{

//提取数字

while(data[i]!=’+’&&data[i]!=’-‘&&data[i]!=’*’&&data[i]!=’/’&&data[i]!='(‘&&data[i]!=’)’&&data[i]!=’\0′){

t+=data[i++];

}

//直接入队

q.push(t);

t=””;

}

}

//把栈弹空

while(!s.empty()){

q.push(s.top());

s.pop();

}

//测试输出后缀表达式

/*while(!q.empty()){

cout<

q.pop();

}

cout<

//计算,还得用到栈。遇到数字压栈,遇到运算符弹出栈顶两个数字,进行计算。

double a=0,b=0;

stack st;

while(!q.empty()){

string d=q.front();

q.pop();

if(d==”+”){

b=st.top();

st.pop();

a=st.top();

st.pop();

st.push(a+b);

}

else if(d==”-“){

b=st.top();

st.pop();

a=st.top();

st.pop();

st.push(a-b);

}

else if(d==”*”){

b=st.top();

st.pop();

a=st.top();

st.pop();

st.push(a*b);

}

else if(d==”/”){

b=st.top();

st.pop();

a=st.top();

st.pop();

st.push(a/b);

}

else{

double temp=0;

int k=0,

flag=0;     //小数部分的标志

//提取数字

while(d[k]!=’\0′){

if(d[k]==’.’){

k++;

flag=10;

continue;

}

if(flag){

temp=temp+(d[k++]-‘0’)/(flag/1.0);

flag*=10;

}

else{

temp=temp*10+d[k++]-‘0’;

}

}

st.push(temp);

}

}

cout<

return 0;

}

2011年机试真题

1.输入一组单词(区分大小写),统计首字母相同的单词个数,相同的单词不累加,输出格式:“字母,个数”

#include

#include

#include

using namespace std;

int main()

{

set s;

map m;

string str;

while(cin>>str)

{

s.insert(str);

}

set::iterator it;

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

{

++m[(*it)[0]];

}

map::iterator mit;

for(mit=m.begin(); mit!=m.end(); mit++)

{

cout<first<second<

}

return 0;

}

2.输入一组单词(区分大小写),输出其字典排序

#include

#include

#include

using namespace std;

int main()

{

int n=0;

string a[105],s;

while(cin>>s)

{

if(s==”0″)

break;

else

a[n++]=s;

}

sort(a,a+n);

for(int i=0;i

cout<

return 0;

}

3.给一个字符串(aaaa(bbbb(cccc,dddd),eeee(ffff)))该字符串表明的是各个人的层次关系。比如aaaa是bbbb和eeee的领导,bbbb是cccc和dddd的领导。先输入一个名称,比如ffff,要求输出其领导关系,输出aaaa>eeee>ffff。

#include

#include

using namespace std;

int main()

{

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

int n=0;

string s,str[105],t;//str为字符串栈

cin>>s>>t;

for(int i=0; i

{

if(s[i]=='(‘)

{

str[n++]=s[i];

}

else if(s[i]==’,’)//遇到逗号时将逗号和前一个左括号之间的内容删除

{

for(int k=n-1; k>=0; k–)

{

if(str[k]!=”(“)

n–;

else if(str[k]==”(“)

{

break;

}

}

}

else if(s[i]==’)’)//遇到右括号将右括号和前一个左括号之间的内容和左括号删除

{

for(int k=n-1; k>=0; k–)

{

if(str[k]!=”(“)

n–;

else if(str[k]==”(“)

{

n–;

break;

}

}

}

else//字母或数字

{

int j;

string tt=””;

for(j=i; j

{

if((s[j]>=’a’&&s[j]<=’z’)||(s[j]>=’A’&&s[j]<=’Z’))

tt+=s[j];

else

{

str[n++]=tt;

break;

}

}

if(tt==t)//找到目标字符串则退出循环

break;

i=j-1;

}

}

for(int i=0; i

{

if(str[i]!=”(“)

{

if(str[i]!=t)

cout<“;

else

cout<

}

}

cout<

return 0;

}