知识点:
(原理)所谓栈即只能单进单出的顺序列,对于一串以某种顺序进栈的数列A我们要判断它是否能通过某种序列B出栈需要借用第三个栈C,依次把A的数列进栈C,每进一个判断一次C栈栈顶的数是否能与B栈将出的第一个数相同,若是相同则把栈C的栈顶出栈,同时把栈B的第一个欲出数换成第二个欲出数,即在逻辑上把栈B的第一个欲出数出栈,然后栈C继续将栈A的数依次进栈、判断、进栈、判断。
(例题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022
题目分析: 此题是一个典型的栈题,用栈的方法解决。用in与out数组分别代表进栈与出栈用res数组来模仿第三个交换栈。
题解代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
charin[100],out[100],res[200]={'\0'};
intn,flag[200],i=0,j=0,top=0;
while(scanf("%d",&n)!=EOF){
scanf("%s",in);
scanf("%s",out);
for(i=0;i<=n;){
if(res[0]=='\0'){
if(top<0){
top=0;
}
res[top]=in[i];
top=strlen(res)-1;
flag[i+j]=0;
i++;
}
if(res[0]!='\0' && res[top]!=out[j]){
res[top+1]=in[i];
top=strlen(res)-1;
flag[i+j]=0;
i++;
}
if(res[0]!='\0' && res[top]==out[j]){
res[top]='\0';
top=strlen(res)-1;
flag[i+j]=1;
j++;
}
}
if(res[0]=='\0'){
printf("Yes.\n");
for(i=0;i<2*n;i++){
if(flag[i]==0){
printf("in\n");
}
else{
printf("out\n");
}
}
printf("FINISH\n");
}
else{
printf("No.\n");
printf("FINISH\n");
}
for(i=0;i<2*n;i++){
res[i]='\0';
}
top=0,j=0;
}
}
网友评论