判断一个字符串是否可以通过另一个字符串通过栈变换得到
假设:源字符串:src 目标字符串:dst
判断规则:
- src与dst的长度必须相等才能进行变换,否则不能变换的到
- 首先定义两个指针p_src和p_dst分别指向src和dst的第一个字符
- 先让p_src对应的元素入栈并进行p_src++,然后取栈顶元素与p_dst对应的元素相比较
- 如果相等,p_dst++,并且栈顶元素出栈
- 如果不相等,在p_src != 0的情况下,再将p_src对应的元素入栈,然后再取栈顶元素与p_dst对用的元素比较,如果相等,p_dst++,并且栈顶元素出栈,重复此动作
- 最终,当p_src == 0时
- 如果栈中没有元素,则可以通过栈变换得到
- 如果栈中有元素,则不可以通过栈变换的到
代码如下:
#include"SeqStack.h"
#include<stdio.h>
int Convert(char* dst, char* src, int len_src, int len_dst) {
if(dst == NULL || src == NULL) {
return -1;
}
if(len_src != len_dst) {
return 0;
}
SeqStack stack;
SeqStackInit(&stack);
int i = 0;
int j = 0;
StackType top_value;
for(; i<len_src; i++) {
SeqStackPush(&stack, src[i]);
while(j < len_dst) {
if(stack.size == 0) {
SeqStackPush(&stack, src[i]);
}
SeqStackTop(&stack, &top_value);
if(top_value == dst[j]) {
j++;
SeqStackPop(&stack);
continue;
}
break;
}
}
if(stack.size == 0) {
return 1;
}
return 0;
}
int main() {
char src[] = {'a', 'b', 'c', 'd', 'e'};
char dst[] = {'b', 'd', 'c', 'e', 'a'};
int len_src = sizeof(src)/sizeof(src[0]);
int len_dst = sizeof(dst)/sizeof(dst[0]);
int ret = Convert(dst, src, len_src, len_dst);
if(ret) {
printf("src 字符串可以通过栈得到 dst\n");
}
else if(ret == 0){
printf("src 字符串不可以通过栈得到 dst\n");
}
else {
printf("输入错误\n");
}
return 0;
}
代码中使用之前写过的SeqStack.h和SeqStack.c