汉诺塔的非递归解决办法

#include
#include
#include
using namespace std;

const int maxlen=1000;

typedef struct node{             //工作记录结点
	int adr;                     //返址
	int np;
	char xp,yp,zp;				 //值参
}snode;

typedef struct stack{            //定义栈
	snode info[maxlen+1];
	int top;                     //栈顶指针
}StackType;	

StackType *STInit(){             //初始化栈
	StackType *p;
	if(p=new StackType){         //申请栈空间
		p->top=0;                //设置栈顶为0
		return p;                //返回栈顶指针
	}
	return NULL;                 //申请失败则返回NULL
}

void STClear(StackType *s){      //清空栈
	s->top=0;
}

void STFree(StackType *s){       //释放空间
	delete s;                    //使用delete释放用new运算符申请的内存空间
}

int STPush(StackType *s,snode inf){
	if(s->top==maxlen){
		cout<<"栈溢出"<info[++s->top]=inf;
	return 1;
}

int STPop(StackType *s){
	if(s->top==0){
		cout<<"栈为空,不能再pop()!"<top--;
	return 1;
}

snode *STTop(StackType *s){
	if(s->top==0){
		cout<<"栈为空,不能再top()!"<info[s->top]);
}

void move(char a,int x,char b){
	cout<<"Move Disk"<>n&&n){
		x='x',y='y',z='z';
		STClear(s);              //清空栈,非递归入口
		tmp1.adr=3;tmp1.np=n;tmp1.xp=x;tmp1.yp=y;tmp1.zp=z;
		STPush(s,tmp1);          //当前参量入栈
		
		label0:
		curp=STTop(s);   		 //以curp代替栈顶记录
		if(curp->np==1){
			move(curp->xp,1,curp->zp);
			switch(curp->adr){
				case 1:goto label1;
				case 2:goto label2;
				case 3:goto label3;
			}
		}
		tmp1.adr=1;tmp1.np=curp->np-1;tmp1.xp=curp->xp;tmp1.yp=curp->zp;tmp1.zp=curp->yp;
		STPush(s,tmp1);          //返址和下一层参量入栈
		goto label0;             //转向递归入口
		
		label1:
		STPop(s);       		 //退栈,不是变参无须保存
		curp=STTop(s);
		move(curp->xp,curp->np,curp->zp);
		tmp1.adr=2;tmp1.np=curp->np-1;tmp1.xp=curp->yp;tmp1.yp=curp->xp;tmp1.zp=curp->zp;
		STPush(s,tmp1);
		goto label0;             //转向递归入口
		
		label2:
		STPop(s);
		curp=STTop(s);
		switch(curp->adr){
			case 0:goto label0;
			case 1:goto label1;
			case 2:goto label2;
			case 3:goto label3;
		}

		label3:                  //非递归出口
		STPop(s);
		cout<<"success!"<

 

你可能感兴趣的:(Data,Structrue)