给定一个出栈序列,判断该序列是否合法
方法如下:
1.设置一个辅助栈来存储压入栈而尚未出栈的元素
2.假设压栈序列 {a,b, c, d, e };
3.给定一个出栈序列{c,a, ,b d, e,};
4.判断如下
通过cur遍历压栈序列,通过str遍历出栈序列
cur指a,str指c
判断cur和str的内容是否相等
如果不相等:就把cur所指的内容压入辅助栈
辅助栈:a】 (】表示栈底)
继续遍历cur,cur指b,不相等
辅助栈:b a】
cur继续走,相等
cur和str都指向下一个内容
cur指d,str指a
接下来判断str和辅助栈栈顶元素相等否,不相等(a元素在辅助栈中但是不在栈顶,
就表示该出栈序列是错误的了)
所以该序列是错误的出栈序列
主代码如下:
/*判断给定的字符串是否按照出栈顺序*/
int Juge(LinkStack* stack1, LinkStack* stack2, char* str) {
if (stack1 == NULL) {
return;
}
if (stack2 == NULL) {
return;
}
Node* cur = stack1->top;
while (cur != stack1->bottom ) {
/*如果辅助栈不为空,而且辅助栈顶元素的值和str值的字符相等*/
if (!LinkStackEmpty(stack2) && stack2->top->data == *str) {
/*出栈辅助栈top*/
LinkStackPop(stack2);
str++;
}
else {
/*
*辅助栈为空,或者cur的值和str值不相等
*遍历stack1
*/
while (cur->data != *str) {
/*不相等,就把栈1的元素压栈入栈2*/
StackType value = cur->data;
LinkStackPush(stack2, value);
/*然后让cur前进一步*/
cur = cur->next;
/*判断是不是cur到末尾了*/
if (cur == stack1->bottom) {
return 0;
}
}
cur = cur->next;
str++;
}
}
/*出来以后,判断辅助栈是不是为空*/
if (!LinkStackEmpty(stack2)) {
/*如果不为空,代表该字符串序列是错误的*/
return 0;
}
return 1;
}测试代码如下:
void TestJuge() {
LinkStack* stack1 = InitStack();
LinkStack* stack2 = InitStack();
TESTHEAD;
LinkStackPush(stack1, 'e');
LinkStackPush(stack1, 'd');
LinkStackPush(stack1, 'c');
LinkStackPush(stack1, 'b');
LinkStackPush(stack1, 'a');
PrintStack(stack1, "模拟入队列五个元素");
char* str = "cabde";
int i = Juge(stack1, stack2, str);
printf("%d", i);
}代码中用到的链式栈的代码也在我的博客里
通过辅助栈模拟压栈过程,验证给定的出栈序列是否合法。若出栈序列中元素未先压栈或出栈顺序错误,则序列非法。核心判断在于比较当前遍历的压栈元素和出栈元素,若不一致则压入辅助栈,否则检查栈顶元素是否匹配。代码实现包括主函数和测试用例。

3160

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



