|
算法6.8
BiTree CrtExptree( char* exp )
{
//
建立由合法的表达式字符串 exp 确定的只含二元运算符的
// 非空表达式树,返回其存储结构二叉链表的根结点指针
InitStack(S); Push(S,'#'); //
S为暂存运算符的栈
InitStack(PTRS); //
PTRS为暂存子树根指针的栈
p=exp; ch=*p;
while(!(GetTop(S)=='#'&&
ch=='#'))
{
if (!IN(ch,OP)) CrtNode( t, ch ); //
建叶子结点
else {
switch (ch) {
case'(': Push(S, ch); break;
case')': {
Pop(S,c);
while (c!='(')
{ CrtSubtree(t,c); Pop(S,c);} //
建子树直至运算符的栈顶为'('
break;
}
defult:{
while (!GetTop(S,c) && (precede(c,ch)))
{ CrtSubtree(t,c); Pop(S,c);}
// 建子树直至运算符栈顶运算符的优先数低
if ( ch !='#') Push( S,ch);
break;
} // defult
} // switch
} // else
if (ch !='#') { p++; ch = *p; }
} // while
Pop(S, c); Pop( PTRS, t );
DestroyStack(S); DestroyStack(PTRS);
return t;
} // CrtExptree
算法的执行过程如动画所示。 |
|
OP为运算符和括弧的集合,IN(ch,OP) 为 "FALSE" 时表示 ch 为操作数。
其中建叶子结点的算法为:
void CrtNode(BiTree& T,char ch)
{
if (!(T= new BiTNode))
exit(OVERFLOW);
T->data = char;
T->Lchild = T->Rchild = NULL;
Push(PTR,T);
}
建子树的算法为:
void CrtSubtree (Bitree& T,char c)
{
if (!(T= new BiTNode))
exit(OVERFLOW);
T->data = c;
Pop(PTR, rc); T->Rchild = rc;
Pop(PTR, lc); T->Lchild = lc;
Push(PTR, T);} |
|