炸的一看,好像看不懂这个是什么意思。
但是只要嘻嘻想一下就明白了:
a,b,c,d,e按顺序入栈,出栈顺序随意,并且在进栈的过程中可以出栈,列出所有可能情况
比如a,b,c,d,e就是该字符串的栈的输出,再比如c,a,b,e,d就不是该字符串栈的输出。
分析如下:
代码实现:
strstack.c:
#include "seqstack.h"
//arr为入栈字符串,cur为测试字符串,len为arr和cur的长度
int str_judge(char* arr,char* cur,int len)
{
if(arr == NULL || cur == NULL)
{
return -1;
}
seqstack stack;
seqstackInit(&stack);
int i = 0;
int j = 0;
while(1)
{
//入栈
if(i < len)
{
seqstackPush(&stack,arr[i++]);
}
//比较栈顶元素和测试字符串
if(seqstackGetTop(&stack) == cur[j])
{
seqstackPop(&stack);//相等,出栈
j++;//测试字符串移位
if(stack.size != 0)//判断当前栈是否为空
{
if(seqstackGetTop(&stack) == cur[j])//不为空继续比较栈顶和测试字符串
{
seqstackPop(&stack);
j++;
}
}
}
if(i == len)//入栈字符串已全部入栈
{
if(stack.size != 0)
{
if(seqstackGetTop(&stack) != cur[j])
{
break;
}
}
}
if(j == len)//测试字符串已遍历完(其实在这儿已经确定了YES)
{
break;
}
}
if(stack.size == 0)//查看当前栈是否为空
{
return 1;//YES
}
else
{
return 0;//NO
}
}
int main()
{
char arr[] = {'a','b','c','d','e'};
char cur1[] = {'a','b','c','d','e'};
char cur2[] = {'e','d','c','b','a'};
char cur3[] = {'d','e','c','b','a'};
char cur4[] = {'d','c','e','a','b'};
char cur5[] = {'e','d','c','b','a'};
int len = sizeof(arr)/sizeof(arr[0]);
printf("入栈字符串:%s\n",arr);
printf("测试字符串:%s ,正确值为:1,测试值:%d\n",cur1,str_judge(arr,cur1,len));
printf("测试字符串:%s ,正确值为:1,测试值:%d\n",cur2,str_judge(arr,cur2,len));
printf("测试字符串:%s ,正确值为:1,测试值:%d\n",cur3,str_judge(arr,cur3,len));
printf("测试字符串:%s ,正确值为:0,测试值:%d\n",cur4,str_judge(arr,cur4,len));
printf("测试字符串:%s ,正确值为:1,测试值:%d\n",cur5,str_judge(arr,cur5,len));
return 0;
}
效果实例: