入栈出栈的顺序问题

题意
某个字母序列,把这字母序列按顺序压入栈中,在任意过程,允许字符出栈,求所有的可能性
思路
模拟出栈入栈的过程,暴力枚举每一种情况。


#include <cstdio>
#include <iostream>
#include <cstring>
#include <stack>
#include <vector>
using namespace std;
int n;
char str[1000];

void dfs(stack<char> S, vector<char> ans, int cur)
{
    if(cur == n && S.empty()) //边界输出结果
    {
        for(int i = 0; i < ans.size(); i++)
            printf("%c", ans[i]);
        puts("");
        return;
    }
    else if(cur == n && !S.empty()) //全部出栈到结果中
    {
        char ch = S.top();
        ans.push_back(ch);
        S.pop();
        dfs(S, ans, cur);
        S.push(ch);
        ans.pop_back();
        return;
    }
    if(!S.empty()) // 枚举出栈的个数
    {
        stack<char> nS = S;
        vector<char> nans = ans;
        while(!nS.empty())
        {
            nans.push_back(nS.top());
            nS.pop();
            nS.push(str[cur]);
            dfs(nS, nans, cur+1);
            nS.pop();
        }
    }
    //选择此次不出栈
    S.push(str[cur]);
    dfs(S, ans, cur+1);
    S.pop();
}

int main()
{
    cin >> str;
    n = strlen(str);
    stack<char> S;
    vector<char> ans;
    dfs(S, ans, 0);
    return 0;
}
原文地址:https://www.cnblogs.com/Alruddy/p/7667072.html