栈的应用

1、迷宫求解

typedef struct{
	int ord;		//通道块在路径上的‘序号’ 
	PosType seat;	//通道块在迷宫中的‘坐标位置’ 
	int di;			//从此通道块走向下一通道块的“方向 ” 
}SElemType;			//栈的元素类型 
 Status MazePath(MazeType maze,PosType start,PosType end)
{
 //若迷宫maze中存在从入口start到出口end的通道,则求得一条存放在栈中(从栈底到栈顶),并返回TRUE,否则返回FALSE	
	InitStack(S);curpos=start;//设定'当前位置'为‘入口位置’ 
	curstep=1;		//探索第一步 
	do{
		if(Pass(curpos)){	//当前位置可以通过,即是未曾走到过的通道口 
			FootPrint(curpos);//留下足迹 
			e=(curstep,curpos,1);
			Push(S,e);//加入路径 
			if(curpos==end) return (TRUE);//到达终点 
			curpos=NextPos(curpos,1);//下一位置是当前位置的东邻 
			curstep++;//探索下一步 
		}
		else{
			if(!StackEmpty(S)){
				Pop(S,e);
				while(e.di==4&&!StackEmpty(S)){
					MarkPrint(e.seat);Pop(S,e);//留下不能通过的标记,并退回一步 
				}
				if(e.di<4){
					e.di++;Push(S,e);//换下一个方向探索 
					curPos=NextPos(e.seat,e.di);//设定当前位置是该新方向上的相邻块 
				}
			}
		}
	}while(!StackEmpty(S));
	return(FALSE);  
} 
  

2、表达式求值

OperandType EvaluateExpression(){
//算术表达式求值的算符优先算法。OPTR和OPND分别为运算符栈和运算数栈
//OP运算符集合 
	InitStack(OPTR);Push(OPTR,'#');
	InitStack(OPND);c=getchar();
	while(c!='#'||GetTop(OPTR)!='#'){
		if(!In(c,OP)){
			Push(OPND,c);
			c=getchar();//不是运算符则进栈 
		}
		else
			switch(Precede(GetTop(OPTR),c)){
				case '<'://栈顶元素优先权低 
					Push(OPTR,c);c=getchar();
					break;
				case '='://脱括号并接收下一字符 
					Pop(OPTR,x);c=getchar();
					break;
				case '>'://退栈并将运算结果入栈 
					Pop(OPTR,theta);
					Pop(OPND,b);Pop(OPND,a);
					Push(OPND,Operate(a,theta,b));
					break;
			}
	} 
} 
return GetTop(OPND);

3、Hanoi问题

void hanoi(int n,char x,char y,char z)
{//将塔座x上直径由小到大且自上而下编号为1至n的n个圆盘按规则搬到塔坐z上,y可用作辅助塔坐 
//搬动操作move(x,n,z)可定义为(c是初值为0的全局变量,对搬动计数) 
	if(n==1)
		move(x,1,z);//将编号为1的圆盘从x移到z 
	else{
		hanoi(n-1,x,z,y);//将x上编号为1至n-1的圆盘移到y,z作辅助塔 
		move(x,n,z);//将编号为n的圆盘从x移到z 
		hanoi(n-1,y,x,z);//将y上编号为1至n-1的圆盘移到z,x作辅助塔 
	}
 } 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值