问题
- 给定无重复元素的两个等长数组,分别表述入栈序列和出栈序列,请问:这样的出栈序列是否可行:
- 例如:入栈序列为”ABCDEFG”、出栈序列为”BAEDFGC”,则可行;
- 入栈序列为”ABCD”、出栈序列为”BDAC”,不可行;
分析
- 使用一个栈S来模拟压栈出栈的操作,栈顶元素即为s,记入栈序列为A,出栈序列为B,遍历B的每个元素b:
- 初始状态:栈s为空,认为栈顶元素与b相等,将A的当前元素(第一个元素)入栈;
- case1:若b与栈顶元素相等,则检查B的下一个元素,栈顶元素s出栈;
- case2:若b与栈顶元素不相等,将A的当前元素入栈,目的是希望在A的剩余元素中找到b;
代码实现
代码实现如下所示:
#ifndef StackIsPossible_hpp
#define StackIsPossible_hpp
#include <stdio.h>
// 根据入栈序列和出栈序列判断出栈序列是否正确
bool isStackSequencePossible(const char* strIn, const char* strOut) {
std::stack<int> s;
while (*strOut) { // 遍历出栈序列
if (!s.empty() && s.top() == *strOut) { // 栈不为空,并且栈顶元素和出栈序列当前元素相等
s.pop();
strOut++;
} else { // 栈为空
if (*strIn == 0) { // 还有出栈元素,若入栈序列已经到达尾部,显然不符合
return false;
}
s.push(*strIn); // 入栈序列当前元素入栈,往后继续寻找和出栈序列当前元素相等的元素
strIn++;
}
}
return true;
}
#endif /* StackIsPossible_hpp */
测试代码main.cpp:
#include "StackIsPossible.hpp"
int main(int argc, const char * argv[]) {
char* strIn = "ABCDEFG";
char* strOut = "BAEDFGC";
bool isPossible = isStackSequencePossible(strIn, strOut);
printf("%d\n", isPossible);
return 0;
}