[算法] 入栈出栈问题

问题

  • 给定无重复元素的两个等长数组,分别表述入栈序列和出栈序列,请问:这样的出栈序列是否可行:
    • 例如:入栈序列为”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;
}

猜你喜欢

转载自blog.csdn.net/zkp_java/article/details/80740643