初冀 2023-04-04 13:33 采纳率: 61%
浏览 17
已结题

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


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

 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 <iostream>
#include <vector> //vector容器
#include <stack>  //栈容器
using namespace std;
// 算法思想:模拟序列入栈出栈的过程。用减/分而治之的思想递归求解

int num = 0; // 全局变量 计数器,记录数据个数
int m = 5;   // 数据最后一位
int top = 0; // 便于取栈顶元素
// 以下是递归函数,经分析需要3个形参。容器1存放未入栈序列,容器二模拟栈容器,容器三存放结果便于输出。
void moni_out_stack(stack<int> s1, stack<int> s2, vector<int> 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<int> copy_s1 = s1;
        stack<int> 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<int> s1;
    cout << "Inpute the last number :" << endl; // 防止编码乱码这里写英文,输入序列的最后一个数
    cin >> m;
    // 先进后出
    for (int i = m; i > 0; i--)
    {
        s1.push(i);
    }
    stack<int> s2;
    vector<int> s3;
    moni_out_stack(s1, s2, s3);
    cout << "The total number is:" << num << endl;
    system("pause");
    return 0;
}*/

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

img

  • 写回答

3条回答 默认 最新

  • threenewbee 2023-04-04 13:37
    关注

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

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

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月9日
  • 创建了问题 4月4日

悬赏问题

  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 关于#c语言#的问题:我在vscode和codeblocks中编写c语言时出现打不开源文件该怎么办
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询