问题描述:判断元素出栈、入栈顺序的合法性。如入栈的序列“abcde”,出栈序列为“deabc”
思路:定义两个数组分别来存放入栈和出栈序列
步骤1:先将字符串1的第一个字符入栈:
步骤2:将该元素与字符串2的第一个元素进行比较
步骤3:
a):如果相等,就将该元素出栈并且将字符串1的下一个字符入栈,与字符串2的下一个字符进行比较。
b):如果不相等,继续将字符串1的下一个字符入栈,继续做步骤2
栈的相关操作,参考顺序栈的相关操作(C语言)
//IsValid.h #pragma once #include "Stack.h" #include <string.h> #include <stdio.h> int IsValid( char* arr1,char*arr2, int size) { //定义一个比较栈 Stack stack; //初始化栈 StackInit(&stack); //定义两个指针分别指向入栈序列和出栈序列 char*input = arr1; char*output = arr2; //将入栈序列的每一个元素进行比较 while (*input != '\0') { //将入栈序列指针input所指向的元素入栈 StackPush(&stack, *input); //再将刚入栈的元素取出来(为了进行比较) StackDataType temp = getTop(&stack); //如果这个元素和出栈序列指针output所指的元素相等,将该元素出栈 while (temp == *output) { StackPop(&stack); //证明output当前所指的元素可以合法出栈,output++,比较下一个元素 output++; //继续取栈顶元素与此时output所指的元素进行比较 if (!StackIsEmpty(&stack)) { temp = getTop(&stack); } } //如果这个元素和出栈序列指针output所指的元素不相等,就将入栈序列的下一个元素入栈,再与output所指的元素进行比较 input++; } //到这里,证明出栈序列的每一个元素都可以合法出栈 if (*output == '\0') { return 1; } return 0; } //测试函数 void TestValid() { char *in = "abcdefg"; char *out1 = "decfbga"; char *out2 = "fegdacb"; char *out3 = "efdgbca"; char *out4 = "cdbefag"; printf("%s\n", IsValid(in, out1, strlen(in)) ? "合法" : "不合法"); printf("%s\n", IsValid(in, out2, strlen(in)) ? "合法" : "不合法"); printf("%s\n", IsValid(in, out3, strlen(in)) ? "合法" : "不合法"); printf("%s\n", IsValid(in, out4, strlen(in)) ? "合法" : "不合法"); }