可能这个题目猛一看,并不知道题目要求是什么,让我们做什么。首先我们来说说这个题目大意。
给定一个字符串,如:a b d e c
一个栈的入栈顺序为:a b c d e
那么出栈顺序显而易见:e d c b a
题目意思为:字符串 a b d e c 是否能按出栈顺序所打出。比如说,我们先入栈a元素,接着再将a元素出栈,则得到a元素,接着再入b元素,同理出栈,再入c元素,发现与字符串d元素并不一致,那么继续入栈,入d元素,发现与字符串元素一致,继续出栈,依次类推,最终得到我们的字符串abdef,不过整个过程中,我们只执行了入栈出栈操作,并没有改变其入栈出栈的顺序。这就是所要考的内容,给定任意入栈顺序,任意字符串,判断字符串是否能够根据入栈出栈操作得到即可。
这里我们的思路大致是,每次入栈后取栈顶元素与字符串比较,如果一致则出栈栈顶元素,接着比较下一个栈顶是否与字符串第二个元素一致,如果不一致,继续入栈,以此类推,直至入栈结束,或者是字符串到最后一个元素,即可判断。
//实现如下
#include <stdio.h>
#include "seqstack.h"
int str_instack(SeqStack* s, char* str1, char* str2, int len)//str1位入栈顺序,str2位字符串
{
if(str1 == NULL || str2 == NULL) {
return -1;
}
SeqStackType top;
SeqStackInit(s);
int i = 0;
for(; i < len; ++i) {
SeqStackPush(s, *str1);
SeqStackGetFront(s, &top);//取栈顶元素比较
while(top == *str2) {
SeqStackPop(s);
SeqStackGetFront(s, &top);
str2++;
}
if(*str2 == '\0') {//如果str2到达'\0'证明字符串判断结束,即可以经过入栈出栈得到字符串
return 1;
}
str1++;
}
return -1;
}
这里我们用了简单的栈的操作来帮助我们实现。
//测试代码如下
int main()
{
SeqStack s;
int ret;
char str1[5] = {'a', 'b', 'c', 'd', 'e'};
char str2[5] = {'a', 'c', 'd', 'e', 'b'};
char str3[5] = {'a', 'd', 'b', 'e', 'c'};
int len = sizeof(str1)/sizeof(str1[0]);
ret = str_instack(&s, str1, str2, len);
printf("expected ret 1,actual ret %d\n",ret);
ret = str_instack(&s, str1, str3, len);
printf("expected ret -1,actual ret %d\n",ret);
return 0;
}
欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!