序列所有可能的出栈顺序

序列所有可能的出栈顺序,思路如下:
先找到该序列的全排列,然后再检查全排列中每一个序列的出栈合法性,合法则输出。代码如下:

#include 
#include 
#include 
using namespace std;

bool checkStackOutLegal(int *stackIn, int lenIn, vector<int> stackOut, int lenOut)
{
    if (stackIn == nullptr || stackOut.empty())
        return false;
    if (lenIn != lenOut)
        return false;

    stack<int> s;
    int j = 0;
    for (int i = 0; i < lenIn; ++i)
    {
        s.push(stackIn[i]);
        while (s.size() > 0 && s.top() == stackOut[j])
        {
            s.pop();
            ++j;
        }
    }
    return s.size() > 0 ? false : true;
}

void fullPermutation(int *a, int left, int right, vector<vector<int>> &v)
{
    if (left == right)
    {
        vector<int> one;
        for (int i = 0; i < right; ++i)
        {
            one.push_back(a[i]);
        }
        v.push_back(one);
        return;
    }
    else
    {
        for (int i = left; i < right; ++i)
        {
            swap(a[left], a[i]);
            fullPermutation(a, left + 1, right, v);
            swap(a[left], a[i]);
        }
    }
}

int main()
{
    int stackIn[] = { 1, 2, 3 };
    int len = sizeof(stackIn) / sizeof(int);

    vector<vector<int>> v;
    fullPermutation(stackIn, 0, len, v);

    for (int i = 0; i < v.size(); ++i)
    {
        if (checkStackOutLegal(stackIn, len, v[i], len))
        {
            for (int j = 0; j < v[i].size(); ++j)
            {
                cout << v[i][j] << " ";
            }
            cout << endl;
        }
    }

    return 0;
}

你可能感兴趣的:(栈)