/*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容器,自己写了栈的一些操作,为什么编译没错,运行就出现以下问题呢,麻烦帮我看一下吧,真的搞了好几天了