# 栈的应用
1. 括号匹配的检验
int pipei() | |
{ | |
sqstack s; char c; s.top=0; scanf(“%c”,&c); | |
while(c!=’#’){ | |
switch(c){ | |
case ‘(‘ : push(s,c); scanf(“%c”,&c);break; | |
case ‘{‘ : push(s,c); scanf(“%c”,&c);break; | |
case ‘<‘ : push(s,c); scanf(“%c”,&c);break; | |
case ‘)‘ : if(s.top==0) return -1; else if(*(s.top-1)==”(”) pop(s); | |
scanf(“%c”,&c);break; else return -1; | |
case ‘}‘ : if(s.top==0) return -1; else if(*(s.top-1)==”{”) pop(s); | |
scanf(“%c”,&c);break; else return -1; | |
case ‘>‘ : if(s.top==0) return -1; else if(*(s.top-1)==”<”) pop(s); | |
scanf(“%c”,&c);break; else return -1; | |
} | |
} | |
if(s.top!=0) return -1; | |
else return 0; | |
} |
2. 表达式求值
为实现算法,使用两个工作栈。一个称做 OPTR, 用以寄存运算符;另一个称做 OPND, 用以寄存操作数或运算结果。算法的基本思想是:
(1) 首先置操作数栈为空栈,表达式起始符 “#” 为运算符栈的栈底元素;
(2) 依次读入表达式中每个字符,若是操作数则进 OPND 栈,若是运算符则和 OPTR 栈的栈顶运算符比较优先权,然后作相应操作,直至整个表达式求值完毕 (即 OPTR 栈的栈顶元素和当前读入的字符均为 “#”)。
OperandType EvaluateExpression(){ | |
// 算术表达式求值的算符优先算法。设 OPTR 和 OPND 分别为运算符栈和运算数栈 | |
//OP 为运算符集合 OPS 为运算符集合 | |
InitStack (OPTR); | |
Push (OPTR,'#' ); | |
InitStack (OPND) ; | |
C= getchar(); | |
while (c!='#' II GetTop(OPTR)!='#') { | |
if (! In(C, 0P)) { | |
Push((OPND, C); C = getchar(); | |
}else{// 不是运算符则进栈 | |
switch (Precede( GetTop(0PTR),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) ; | |
} // EvaluateExpression |