⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stacks.cpp

📁 设计一个算法
💻 CPP
字号:
#include<iostream>
#include<fstream>
template<class T>
class Stack
{
    private:
		int top;
		int MaxTop;
		T *stack;		
	public:
		Stack(int n=10);		
		~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 Out(std::ofstream &fout);				   		
};
template<class T>
Stack<T>::Stack(int n)
{
	MaxTop=n-1;
	stack=new T[n];
	top=-1;	
}
template<class T>
T Stack<T>::Top() const
{
	return stack[top];
}
template<class T>
Stack<T>& Stack<T>::Push(const T &x)
{	
	stack[++top]=x;
	return *this;
}
template<class T>
Stack<T>& Stack<T>::Pop(T &x)
{	
	x=stack[top--];
	return *this;
}
template<class T>
void Stack<T>::Out(std::ofstream &fout)
{
    for(int i=top;i>0;i--)
        fout<<stack[i]<<" ";
    fout<<stack[0];
}
void perm(int *pos,int k,int n,int index,int &count,std::ofstream &fout,Stack<int> &s)//pos数组储存排列,index控制pos数组下标,k代表进栈次数
{
    int temp;
    if(k>=n){        
        for(int i=1;i<index && i<=n-1;i++)
            fout<<pos[i]<<" ";//输出前面有空格的数 
        if(!s.Empty())//如果栈非空,那么输出 
            s.Out(fout);
        else fout<<pos[n];//否则输出最后一个元素 
        fout<<std::endl;
        count++;//计数器加
    }
    else{       //若未到达终点时
        if(!s.Empty()){//若栈非空
            s.Pop(temp);//弹出并储存于pos数组
            pos[index]=temp;
            perm(pos,k,n,index+1,count,fout,s);//访问右子树,k不变,因为没有进栈
			s.Push(temp);//重新将刚才弹出的元素压回,回溯
        }      
        s.Push(k+1);//进栈
        perm(pos,k+1,n,index,count,fout,s);//访问左子树,因为有进栈动作发生,所以k+1 
		s.Pop(temp);//重新弹出,回溯
    }
}
using namespace std;
int main()
{
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    if(!fin.is_open()){
        fout<<"error"<<endl;
        exit(1);
    }
    int n;
    while(fin>>n){
        int count=0;
        int *pos=new int[n+1];
        Stack<int> s(n);
        int i=n;             
        perm(pos,0,n,1,count,fout,s);        
        fout<<count<<endl;
        delete []pos;
    }
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -