输出所以可能出栈序列出问题了


 /*3)假设栈的输入序列为1、2、3、...、n,设计算法求出所有可能的出栈序列。
比如输入1、2、3、4、5,可能出栈的序列为12345、13452等42个。
*/
#include
#include
#include   

 using namespace std;
#define max 100
typedef int element;
   typedef struct sStack {
    element data[max];
    int top;
}seqStack;
void initialStack(seqStack& S) {
    S.top = -1;
}
bool stackEmpty(seqStack& S) {
    if (S.top == -1)
        return true;
    else
        return false;
}
bool stackFull(seqStack& S) {
    if (S.top == max - 1)
        return true;
    else
        return false;
}
bool pushStack(seqStack& S, element x) {//入栈
    if (stackFull(S))
        return false;
    else
    {
        S.top++;
        S.data[S.top] = x;
        return true;
    }
}
bool popStack(seqStack& S) {//出栈
    if (stackEmpty(S))
        return false;
    else {
        element x;
        x = S.data[S.top];
        S.top--;
        return true;
    }
}
/*int sizeStack(seqStack& S) {//求栈中元素个数
    int count=0;
     while (!stackEmpty(S)) {
        popStack(S);
        count++;
     }
    return count;
}*/
bool stackTop(seqStack& S, element& x) {//取栈顶元素
    if (stackEmpty(S))
        return false;
    else {
        x = S.data[S.top];
        return true;
    }
}
//a存放输入序列,S是中间栈,b存放输出序列
void fun(vector<int>& a, int n, seqStack& S, vector<int>& b) {
    if (b.size()==n) {
        for (int i = 0; i < b.size(); i++) {
            cout << b[i] << " ";
        }
        cout << endl;
        return;
    }
    if ( a.empty() &&stackEmpty(S)) {
        return;
    }
    else if (!stackEmpty(S) && a.empty()) {
        element y;
        stackTop(S, y);//取栈顶元素
        b.push_back(y);//尾插入b中
        popStack(S);//栈顶元素出栈
        fun(a, n, S, b);
       // b.pop_back();
       // pushStack(S, y);
    }
    else if (!a.empty() && stackEmpty(S)) {
        element z = 0;
        z = a.front();//取a第一个元素
        pushStack(S, z);
        a.erase(a.begin()); //删除a第一个元素
        fun(a, n, S, b);
       // popStack(S);
       // pushStack(a, z);
    }
    else {
        vector<int>& aCopy = a;
        seqStack Scopy = S;

         element y;
        stackTop(Scopy, y);//取栈顶元素
        b.push_back(y);//尾插入b中
        popStack(Scopy);//栈顶元素出栈
        fun(aCopy, n, Scopy, b);

        element z = 0;
        z = a.front();//取a第一个元素
        pushStack(S, z);//入栈
        a.erase(a.begin()); //删除a第一个元素
        fun(a, n, S, b);
    }
}
 int main() {
    seqStack S;
    vector<int>a,b;
    initialStack(S);
      int n;
     cout << "输入序列最后一个数:";
    cin >> n;
     for (int i = 1; i <= n; i++) {
        a.push_back(i);
     }
    fun(a, n, S, b);
    return 0;
} 
 
-----------------------------------------------------------------------------



/*#include 
#include  //vector容器
#include   //栈容器
using namespace std;
// 算法思想:模拟序列入栈出栈的过程。用减/分而治之的思想递归求解

int num = 0; // 全局变量 计数器,记录数据个数
int m = 5;   // 数据最后一位
int top = 0; // 便于取栈顶元素
// 以下是递归函数,经分析需要3个形参。容器1存放未入栈序列,容器二模拟栈容器,容器三存放结果便于输出。
void moni_out_stack(stack s1, stack s2, vector s3)
{
    if (s3.size() == m)
    {
        for (int i = 0; i < s3.size(); i++)
        {
            cout << s3[i];
        }
        num++;
        cout << endl;
    }
    if (s1.empty() && s2.empty()) // 结束判断;出口
    {
        return;
    }
    else if (!s1.empty() && s2.empty()) // 栈容器空只能入栈
    {
        top = s1.top();
        s1.pop();
        s2.push(top);
        moni_out_stack(s1, s2, s3);
    }
    else if (s1.empty() && !s2.empty()) // 栈容器满只能出栈
    {
        top = s2.top();
        s2.pop();
        s3.push_back(top);
        moni_out_stack(s1, s2, s3);
    }
    else // 普通情况,两者皆可
    {
        // 拷贝一份,用于分而治之
        stack copy_s1 = s1;
        stack copy_s2 = s2;
        // 入栈操作
        top = s1.top();
        s1.pop();
        s2.push(top);
        moni_out_stack(s1, s2, s3);
        // 出栈操作
        top = copy_s2.top();
        copy_s2.pop();
        s3.push_back(top);
        moni_out_stack(copy_s1, copy_s2, s3);
    }
}
int main()
{
    stack s1;
    cout << "Inpute the last number :" << endl; // 防止编码乱码这里写英文,输入序列的最后一个数
    cin >> m;
    // 先进后出
    for (int i = m; i > 0; i--)
    {
        s1.push(i);
    }
    stack s2;
    vector s3;
    moni_out_stack(s1, s2, s3);
    cout << "The total number is:" << num << endl;
    system("pause");
    return 0;
}*/

上面是我写的代码,下面是别人的可以运行的代码,我只是没有用系统stack容器,自己写了栈的一些操作,为什么编译没错,运行就出现以下问题呢,麻烦帮我看一下吧,真的搞了好几天了

img

你f5调试运行,不要ctrl+f5编译运行
看下出错的行

应该是出现空栈了,你没有判断出来

错误的意思是你在用front函数时,vector是空的,所以崩溃了

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^