栈的应用
行编辑程序,一个输入缓冲区,可以接受用户输入的一行字符,并允许改错
void LineEdit(){
InitStack(s); //构造栈s
ch=getchar();
while(ch!=EOF){ //EOF文件结束符
while(ch!=EOF&&ch!='\n'){
switch(ch){
case '#': pop(s,ch); break;
case '@': clearStack(s); break;
default : push(s,ch); break;
}
ch=getchar();
}
clearStack(s);
if(ch!=EOF) ch=getchar();
}
destroryStack(s);
}
迷宫求解,
typedef struct{
int ord;//通道块在路径上的“序号”
PosType seat;//通道块在迷宫中的“坐标位置”
int di; //从此通道块走向下一通道块的方向
}SElemType;
Status MazePath(MazeType mze,PosType start,PosType end){
InitStack(S); curpos=start; //设定当前位置为入口位置
curstep=1; //探索第一步
do{
if(pass(curpos)){ //当前位置可以通过,即未曾到过的通道块
footPrint(curois); //留下足迹
e=(curstep,curpos,1);
push(s,e); //加入路径
if(curpos==end) retur true;//到达终点
curpos=nextPos(curpos,1); //下一位置是当前位置的相邻
curstep++; //探索下一步
}
else{
if(!stcakEmpty(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;
}
表达式求值
OperandType EvaluateExpression(){
InitStack(OPYR); push(OPTR,'#'); //OPTR运算符栈OPND运算数栈
InitStack(OPND); c=getchar();
while(c!='#'||getTop(OPTR)!='#'){
if(!stackElem(OPTR,c)) {push(OPND,c);c=getchar();}
else
switch(precede(getTop(OPTR),c)){
case '<': push(OPTR,c);c=getchar();break;//栈顶元素优先级低
case '=': pop(OPTR,t); c=getchar();break;//脱括号接收下一字符
case '>': //将计算结果入栈
pop(OPTR,theta);pop(OPND,b);pop(OPND,a);push(OPND,Operate(a,theta,b);break;
}
}
return getTop(OPND);
}