主题:[讨论]帮忙
问题描述:
在一个列车调度站中,1条轨道连接到1 条侧轨处,形成1 个铁路转轨栈,如下图所示。
其中左边轨道为车皮入口,右边轨道为出口,编号为1,2,…,n的n个车皮从入口依次进
入转轨栈,由调度室安排车皮进出栈次序,并对车皮按其出栈次序重新编序a , a , ,an 1 2  。
«编程任务:
给定正整数n,编程计算左边轨道车皮编号依次为1,2,…,n时,在右边轨道最多可
以得到多少个不同的车皮编序方案。
例如当n=3 时,最多得到5组不同的编序方案如下:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
#include<iostream>
using namespace std;
int num = 0;
class OutOfBounds{};
class NoMem{};
template<class T>
class Stack
{
public:
Stack(int Max = 20);
~Stack() {delete [] stack;}
bool Empty() const {return top == -1;}
bool Full() const {return top == MaxTop;}
T Top () const ;
Stack<T>& Push(const T& x);
Stack<T>& Pop(T& x);
void PrintStack (ostream& out) const;
friend void sort( Stack<T> &wait , Stack<T> &in , const int &n , const int &m );
private:
int top;
int MaxTop;
T *stack;
};
template<class T>
Stack<T>::Stack(int Max)
{
MaxTop = Max - 1;
stack = new T[Max];
top = -1;
}
template<class T>
T Stack<T>::Top() const
{
if (Empty()) throw OutOfBounds();
else return stack[top];
}
template<class T>
Stack<T>& Stack<T>::Push(const T& x)
{
if (Full()) throw NoMem();
stack[++top] = x;
return *this;
}
template<class T>
Stack<T>&Stack<T>::Pop(T& x)
{
if (Empty()) throw OutOfBounds();
x = stack[top--];
return *this;
}
template<class T>
void Stack<T>::PrintStack(ostream& out) const
{
for (int i = 0;i < top+1;++i)
out << stack[i] << " ";
}
//重载输出函数
template<class T>
ostream & operator << (ostream & out,const Stack<T> & x)
{
x.PrintStack(out);
return out;
}
template<class T>
void sort( Stack<T> &wait , Stack<T> &in , const int &n , const int &m )
{
T result[1000];
T x,y;
if( wait.Empty() && in.Empty() )
{
for( int i = 0; i < n; i++ )
cout << result[i] << " ";
cout << endl;
num++;
}
else
{
if( !in.Empty())
{
y = in.Top();
in.Pop(y);
result[m] = y;
sort( wait , in , n , m+1 );
in.Push( y );
}
if( !wait.Empty() )
{
x = wait.Top();
wait.Pop(x);
in.Push( x );
sort( wait , in , n , m );
[color=FF00FF]in.Pop();////////////这里有错,麻烦帮忙一下啊[/color]
wait.Push( x );
}
}
}
int main()
{
Stack<int> s1 , s2;
for( int i = 3; i > 0; i-- )
s1.Push(i);
sort( s1 , s2 , 3 , 0 );
cout << num << endl;
return 0;
}
在一个列车调度站中,1条轨道连接到1 条侧轨处,形成1 个铁路转轨栈,如下图所示。
其中左边轨道为车皮入口,右边轨道为出口,编号为1,2,…,n的n个车皮从入口依次进
入转轨栈,由调度室安排车皮进出栈次序,并对车皮按其出栈次序重新编序a , a , ,an 1 2  。
«编程任务:
给定正整数n,编程计算左边轨道车皮编号依次为1,2,…,n时,在右边轨道最多可
以得到多少个不同的车皮编序方案。
例如当n=3 时,最多得到5组不同的编序方案如下:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
#include<iostream>
using namespace std;
int num = 0;
class OutOfBounds{};
class NoMem{};
template<class T>
class Stack
{
public:
Stack(int Max = 20);
~Stack() {delete [] stack;}
bool Empty() const {return top == -1;}
bool Full() const {return top == MaxTop;}
T Top () const ;
Stack<T>& Push(const T& x);
Stack<T>& Pop(T& x);
void PrintStack (ostream& out) const;
friend void sort( Stack<T> &wait , Stack<T> &in , const int &n , const int &m );
private:
int top;
int MaxTop;
T *stack;
};
template<class T>
Stack<T>::Stack(int Max)
{
MaxTop = Max - 1;
stack = new T[Max];
top = -1;
}
template<class T>
T Stack<T>::Top() const
{
if (Empty()) throw OutOfBounds();
else return stack[top];
}
template<class T>
Stack<T>& Stack<T>::Push(const T& x)
{
if (Full()) throw NoMem();
stack[++top] = x;
return *this;
}
template<class T>
Stack<T>&Stack<T>::Pop(T& x)
{
if (Empty()) throw OutOfBounds();
x = stack[top--];
return *this;
}
template<class T>
void Stack<T>::PrintStack(ostream& out) const
{
for (int i = 0;i < top+1;++i)
out << stack[i] << " ";
}
//重载输出函数
template<class T>
ostream & operator << (ostream & out,const Stack<T> & x)
{
x.PrintStack(out);
return out;
}
template<class T>
void sort( Stack<T> &wait , Stack<T> &in , const int &n , const int &m )
{
T result[1000];
T x,y;
if( wait.Empty() && in.Empty() )
{
for( int i = 0; i < n; i++ )
cout << result[i] << " ";
cout << endl;
num++;
}
else
{
if( !in.Empty())
{
y = in.Top();
in.Pop(y);
result[m] = y;
sort( wait , in , n , m+1 );
in.Push( y );
}
if( !wait.Empty() )
{
x = wait.Top();
wait.Pop(x);
in.Push( x );
sort( wait , in , n , m );
[color=FF00FF]in.Pop();////////////这里有错,麻烦帮忙一下啊[/color]
wait.Push( x );
}
}
}
int main()
{
Stack<int> s1 , s2;
for( int i = 3; i > 0; i-- )
s1.Push(i);
sort( s1 , s2 , 3 , 0 );
cout << num << endl;
return 0;
}