假设某火车站采用后进先出的模式。现有n列火车,调度人员给出火车进站的序列,并给出火车出站的序列,判断在这个调度要求能否实现,如果能实现写出火车进站、出站的操作序列。(栈) 输入:第一行为一个正整数N代表火车数量;第二行为N个字母,中间用空格分开,代表N个火车的进站顺序;第三行为N个字母,中间用空格分开,代表N个火车的离站顺序。输出:第一行输出0或1,0代表该调度无法实现,1代表可以实现;如果可以实现,请在第二行输出进站出站序列。表示进站时在字母后加上‘面’,出站加上‘out’。
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
//判断调度能否实现
int Judge(char a[],char b[],char c[],int n){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(b[j]==a[i]){
c[j]=i;
}
}
}
for(int i=0;i<n;i++){
for(int j=++i;j<n;j++){
if(c[i]<c[j]){
for(int k=++j;k<n;k++){
if(c[j]<c[k]){
break;
return 0;
}
}
}
}
}
return 1;
}
//定义栈
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;
//栈初始化
void Initstack(SqStack *S){
S->base=(char *)malloc(sizeof(char));
S->top=S->base;
S->stacksize=maxsize;
}
//入栈
void Push(SqStack *S,char a){
*S->top++=a;
}
//出栈
SqStack Pop(SqStack *S){
if(S->top!=S->base){
S->top--;
}
}
//输出顺序
char Print(char a[],char b[],int n){
SqStack *S;
Initstack(S);
int j=0;
for(int i=0;i<n;i++){
Push(S,a[i]);
printf("%c_in",a[i]);
while(b[j]==*S->top){
Pop(S);
printf("%c_out",b[i]);
j++;
}
}
}
//主函数
int main(){
int n,d;
scanf("%d",&n);
char a[n],b[n],c[n];
for(int i=0;i<n;i++){
scanf("%c",&a[i]);
}
for(int i=0;i<n;i++){
scanf("%c",&b[i]);
}
d=Judge(a[n],b[n],c[n],n);
printf("%d",d);
Print(a[n],b[n],n);
return 0;
}