--------------题目大意------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目有多个测试数据,两行的数据为一组,读入两个字符串s1,s2,题目问的是s1如何通过栈的push和pop操作得到字符串s2,输出所有的进栈出栈方法,进栈 用'i'表示,出栈用’o'表示。例如:
Sample Input
madam adamm bahama bahama long short eric rice
Sample Output
[ i i i i o o o i o o i i i i o o o o i o i i o i o i o i o o i i o i o i o o i o ] [ i o i i i o o i i o o o i o i i i o o o i o i o i o i o i o i i i o o o i o i o i o i o i o i o ] [ ] [ i i o i o i o o ] ---------题解思路-------------------------------------------------------------------------------------------------------------------------------- 简单说一下我的思路,方法可能不是很好 我用的是搜索的方法,两个指针p1,p2分别指向s1,s2,以及一个指针p指向栈stack[]的顶,接下来分为两种情况 当s1[p1]!=s2[p2] 只能进栈---搜索(p1+1,p2,p+1) 当s1[p1]==s2[p2] 可以直接出栈---搜索(p1,p2+1,p-1) 也可以接着进栈---搜索(p1+1,p2,p+1) 边界条件 p2==Lenth(s2) 表示完成,直接输出方案 剪枝条件 p==Lenth(s1)-1&&stack[p]!=s2[p2] 表示栈已满,但栈顶元素不等于出栈元素 ---------鄙人代码--------------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char s1[100],s2[100],st[100],s[200];
int l,i=0;
void go(char st[],int p1,int p2,int p);
int main()
{
while(scanf("%s",s1)!=EOF)
{
scanf("%s",s2);
st[0]=s1[0];
l=strlen(s1);
s[0]='i';
printf("[\n");
go(st,0,0,0);
printf("]\n");
}
return 0;
}
void go(char st[],int p1,int p2,int p)
{
if(p==l-1&&st[p]!=s2[p2])
{
return;
}
if(p2==l)
{
int j=0;
for(j=0;j<=i;j++)
printf("%c ",s[j]);
printf("\n");
return;
}
if(st[p]!=s2[p2])
{
if(p1<l-1)
{
st[p+1]=s1[p1+1];
i++;s[i]='i';
go(st,p1+1,p2,p+1);
i--;
}
}
else
if(st[p]==s2[p2])
{
if(p1<l-1)
{
st[p+1]=s1[p1+1];
i++;s[i]='i';
go(st,p1+1,p2,p+1);
i--;
}
i++;s[i]='o';
go(st,p1,p2+1,p-1);
i--;
}
}
本文介绍了一种使用递归搜索算法解决字符串通过栈的push和pop操作转换问题的方法,并提供了具体的C语言实现代码。
259

被折叠的 条评论
为什么被折叠?



