}
}
return0;
}
第四次作业:
单链表操作9014,9016,9017
9014:
删最小值
ProblemDescription
设有一单链表,现要求删除其最小值(假设最小值唯一)。
若删除成功,则输出被删的最小值;若删除失败,则输
出“notexist”。
Input
有多组数据,每组第一行为单链表的元素个数n(0<=n<100);第二行为单链表的各个元素。
Output
若删除成功,则输出被删的最小值;若删除失败,则输出“notexist”。
SampleInput
8
426-319145
5
24167
SampleOutput
-3
1
//9014ANSWERCODE1
#include
usingnamespacestd;
structNode{intdata;Node*next;};intmain()
{
inti,n,data[100],min;
Node*first,*p,*q,*s,*tail;
while(cin>>n)
{
if(n==0){cout<<"notexist\n";continue;}
for(i=0;i>data[i];
first=newNode;first->next=NULL;tail=first;
for(i=0;i{s=newNode;s->data=data[i];tail->next=s;tail=s;}
tail->next=NULL;
p=first;min=first->next->data;
while(p->next)
{q=p;p=p->next;
if(p->datadata;
}
p=first->next;q=first;
while(p)
{if(p->data==min)break;
else{q=p;p=p->next;}}
if(p&&q){q->next=p->next;deletep;cout<else{cout<<"notexist\n";}
}
return0;
}
9016:
查找倒数第k个结点
ProblemDescription
有一单链L,请输出该单链表中倒数第k个结点的值。
若该结点不存在,则输出“notfind”。
Input
有多组数据,每组第一行为单链表元素个数n和k值(00);第二行为单链表的各元素。
Output
输出该单链表中倒数第k个结点的值。
若该结点不存在,则输出“notfind”。
SampleInput
51
12345
55
12345
SampleOutput
5
1
//9016ANSWERCODE1
#include
usingnamespacestd;
structNode{intdate;Node*next;};intmain()
{
intn,k,i,c,data[100];Node*first,*r,*p,*s;
while(cin>>n>>k)
{
for(i=0;i>data[i];
first=newNode;r=first;
for(i=0;i{s=newNode;s->date=data[i];
r->next=s;r=s;
}
r->next=NULL;
//倒数第k个就是正数第n-k+1个。
if(k<=n&&k>=1)
{
p=first->next;c=1;
while(p&&c<(n-k+1)){p=p->next;c++;}
if(p&&c==(n-k+1)){cout<date<}
elsecout<<"notfind"<}
return0;
}
9017:
统计选票
ProblemDescription
设有m个候选人n张选票,每张选票选且只选一人,候选人编号依次为1,2,3,...,m。
现将这n张选票存于一
单链表中,要求统计并输出每个候选人的得票结果。
Input
有多组数据,每组第一行为候选人总数m和选票总数n(m>0,0Output
输出每个候选人的得票结果,数字之间用一个空格隔开。
SampleInput
36
131221
58
33433211
SampleOutput
321
21410
//9017ANSWERCODE1
#include
usingnamespacestd;intmain()
{
intvotes[100],n,i,m,c;
while(cin>>m>>n)
{
for(i=1;i<=m;i++)votes[i]=0;
for(i=0;i{cin>>c;
votes[c]++;}
for(i=1;icout<}
return0;
}
第五次作业:
特殊线性表栈操作9045,9042,9041
9045:
判栈输出序列的有效性
ProblemDescription设一个栈的输入序列为1,2,3,...,n-1,n。
请编写一个算法,判断一个序列p1,p2,p3,...,pn是否是一个有效的栈输出序列。
若有效输出1,无效输出0。
Input
有多组数据,每组第一行为序列长度n(n<=50),第二行为一个由1~n值组成的长度为n且值无重复的序列。
Output
栈输出序列有效输出1,无效输出0。
SampleInput
3
123
3
312
SampleOutput
1
0
//9045ANSWERCODE1
#include
usingnamespacestd;intmain()
{
intn,i,j,in,out;//in输入序列指针,out输出序列指针
intoutput[51],stack[51],top=-1;
while(cin>>n){
for(i=0;i>output[i];
top=-1;in=0;
for(i=0;iout=output[i];
if(out>in){
for(j=in+1;j<=out;j++)stack[++top]=j;
in=out;
}
if(stack[top]==output[i])top--;
else{cout<<"0\n";break;}
}
if(i==n&&top==-1)cout<<"1\n";
}
return0;
}
9042:
判操作序列有效性
ProblemDescription
假设以I和O分别表示入栈和出栈操作。
栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成
的序列,称可以操作的序列为合法序列,否则成为非法序列。
请编写一个对该操作序列的有效性进行判断,若有效
,无效输出0。
输出1
Input
有多组数据,每组为由I和O组成的序列,序列长度不超过50。
Output
操作序列有效输出1,无效输出0。
SampleInput
IOIIOIOO
IOOIOIIO
SampleOutput
1
0
//9042ANSWERCODE1
#include
usingnamespacestd;
intmain()
{
intn,i,flag;
charstr[51],stack[51],top=-1;
while(cin>>str)
{
n=strlen(str);top=-1;flag=0;
for(i=0;i{
if(str[i]=='I'){stack[++top]=str[i];}
elseif(str[i]=='O')
{
if(top>-1)top--;
else{cout<<"0\n";flag=1;break;}
}
else{cout<<"0\n";flag=1;break;}
}
if(top==-1&&i==n&&flag==0){cout<<"1\n";}
else{if(flag==0)cout<<"0\n";}
}
return