#includeiostream#includewindows.husingnamespacestd;constintMAXSIZE=8;//定义栈的最大高度templateclassTclassQueStack//定义顺序栈模板类{public:QueStack(){top=-1;num=0;}//构造函数,初始化空栈voidPush(Tx);//入栈voidPop();//出栈voidSetPlace();voidBegin(QueStacka);//摆放8皇后的递归函数boolJudge();//判断是否在同一行同一列同一斜线voidPrint();//打印棋盘private:Tdata[MAXSIZE];//定义数组inttop;intnum;//初始化摆放方案计数器//栈顶指针};templateclassTvoidQueStackT::Push(Tx)//入栈操作{if(top=MAXSIZE-1)throwupoverflow;//栈顶指针上移data[++top]=x;}templateclassTvoidQueStackT::Pop()//出栈操作{if(-1==top)throwdownoverflow;top--;//栈顶指针下移}templateclassTvoidQueStackT::SetPlace()//在栈顶放置符合条件的值的操作,即摆放皇后{for(inti=0;iMAXSIZE;i++)//穷尽0~7,即穷尽列{Push(i);if(Judge())//判断摆放皇后的位置是否安全{if(top!=(MAXSIZE-1))//若还没有放到第八个皇后,则进行下一个皇后的放置SetPlace();else{num++;//解数加1Print();//打印成功的棋盘}}Pop();//若不符合条件则出栈}}templateclassTboolQueStackT::Judge(){for(inti=0;itop;i++)//依次检查前面各行的皇后位置if(data[top]==data[i]||(abs(data[top]-data[i]))==(top-i))//判断是否在同一列同一斜线returnfalse;returntrue;}templateclassTvoidQueStackT::Print()//将栈的数组形式打印成棋盘形式{coutNO.num:endl;for(inti=0;iMAXSIZE;i++){for(intj=0;jMAXSIZE;j++){if(j==data[i]){cout*;}else{cout-;}}coutendl;//换行}Sleep(100);//coutendl;}templateclassTvoidQueStackT::Begin(QueStacka){a.SetPlace();cout方法总数为:a.numendl;}voidmain(){QueStackintQueen;Queen.Begin(Queen);//定义类的对象system(pause);}