1、二叉树T已经存在。销毁T。 Value(&计算出T所表示的四则运算表达式的值并返回。ADT BineryTree顺序栈的抽象数据类型定义ADT Stack具有相同类型及后进先出特性的数据元素集合。相邻数据元素具有前去和后继关系。 基本操作: InitStack(&无构造一个空栈S。 DestroyStack(&栈S已经存在。销毁S。 StackLength(&返回S中元素个数。 GetTop(S , &e)栈S已经存在且非空。用e返回S的栈顶元素。 Push(&S , e)插入元素e为S的新栈顶元素。 Pop(& 初始条件:删除S的栈顶元素,并用e返回其值。ADT Stack字符串的抽象数据类
2、型定义ADT String具有字符类型的数据元素集合。相邻数据元素具有前驱和后继关系。 StrLength(S)串S已经存在。返回S的元素个数。 StrNeg(S , F)串S已经存在且非空。求S的逆序并将结果保存在串F中。ADT String本程序包含四个模块:主程序模块;二叉树单元模块(实现二叉树的抽象数据类型,包括结点和指针的定义);顺序栈单元模块(实现顺序栈的抽象数据类型,包含结点和指针的定义);字符串单元模块(实现字符串的抽象数据类型)。四个模块之间调用关系为主程序模块二叉树模块,二叉树模块调用顺序栈模块。详细设计顺序栈类型。#define Stack_Size 100typedef
3、 struct char elemStack_Size; int top;SqStack 基本操作实现的伪代码算法如下: void InitStack (SqStack &S) /初始化顺序栈 S.elem=new ElemTypeStack_Size; if(!S.elem) Error(Overflow!); S.top=-1; viod Push (SqStack &S,char c) /顺序栈压栈 if(S.top=(Stack_Size-1) Error(Stack Overflow! S.elem+S.top=c;ElemType Pop (SqStack &S) /顺序栈出栈 i
4、f(S.top=-1) Error(Stack Empty! return S.elemS.top-; int StackLength(SqStack &S) /求顺序栈长度 return (S.top+1); GetTop(SqStack &S ,char e) /取栈顶元素 e=S.elemtop;字符串类型typedef struct /动态顺序串 char *ch; int length;String基本操作实现的伪代码算法如下:int StrLength(&S) /求串长 return S.length;void StrNeg(&S , &F) /求逆序串if(!S.length)
5、error(“String Empty!”); for(i=0 ; i=0 ; i-) /对输入串逆序扫描 if(Str.chi=48&Str.chi=Precedence( GetTop(S) ) ) Push( S , Str.chi ); else Pop(S , e); Output.chi=e;Output.length+; ) /假如是左括号,栈中运算符逐个出栈并输出,直到遇到右括号。右括号出栈并丢弃。 while( GetTop(S)!= ) Output.chi=Pop(S); while(S.top!=-1) /假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。 Outp
6、ut.ch=Output.ch-;Output.ch=Pop(S); return output;void CreatBiTree(&S) /由中缀表达式生成表达式二叉树 String F; SqStack Sq; /用以存放生成的二叉树结点 InitStack(Sq); F=Convert(S); /求得S的前缀表达式 for(i=F.length-1 ; i-) If( !IsOperator(F.chi) ) T=new TNode; T-data=F.chi;lchild=NULL;rchild=NULL; Push(Sq , T) else lchild=Pop( Sq );rchi
7、ld=Pop( Sq ); Push(Sq , T);int Calc(int a, char opr, int b) /计算 switch (opr) case return a + b; return a - b; return a * b; return a / b;int Value(TNode *T) if (T-lchild = NULL &T-rchild = NULL) return T-data; return Calc( Value(T-lchild) , T-data , Value(T-rchild) );主函数伪码算法。void main() Face(); /输出界
8、面及相关信息 do cout”Please input an expression:”Str; JudgeExp(S); /判断输入的表达式是否合法。T=CreatBiTree(S);N=Value(T);cout”The value of this expression is”Ne;if(e=y) flag=1;else flag=0; while(flag) /main测试结果附录(带注释的源程序)/*CStack.h*/#includeusing namespace std;typedef struct /字符类型顺序栈CStackvoid InitCStack(& /初始化顺序栈 S.
9、elem=new charStack_Size; if(! S.top=-1;void Push_C(CStack &S , char e) /压栈 if( S.top=(Stack_Size-1) ) Error( S.elem+S.top=e;char Pop_C(CStack & /出栈 if(S.top=-1) Error( return S.elemtop-;char GetTop(& /取栈顶元素 return S.elemtop;int CStackLength(& /求栈中元素个数 return top+1;/*TStack.h*/#includeTree.h /二叉树结点类型
10、顺序栈 TNode elemStack_Size;TStackvoid InitTStack(&void Push_T(TStack &S , TNode T) S.elem+S.top=T;TNode Pop_T(TStack &/*String.h*/typedef struct /动态顺序串 int len;Srting StrNeg(&Str) /求逆序串 F.chi = Str.chStr.len-1-i; return Fint StrLen(&Str) /求串长 int i; Str.chi!0 ; ) i+; return i;/*Tree.h*/String.hCStack.
11、hTStack.h /二叉树结点 union data /数据域 char opr; int opn; /运算数 struct TNode *lchid , *rchild; /指针域typedef TNode *BiTree; /二叉树头结点int Precedence(char opr) /判断运算符级别函数; switch(opr) return 1; return 2; return 0;bool IsOperator(char opr) /判断输入串中的字符是不是合法操作符 if(op= return true;String Convert(String &Str) /将一个中缀串转
12、换为后缀串 String Output; /输出串 Output.len=0; CStack S; InitCStack(S); Str.len=StrLen(Str); /求的输入的串长 for(i=Str.len-1 ; i-) /对输入串逆序扫描 if(Str.chi=48 & Str.chi=57) /假如是操作数,把它添加到输出串中。 Output.chStr.len-1-i=Str.chi; Output.len+; ) /假如是右括号,将它压栈。 Push_C( S , Str.chi ); while( IsOperator( Str.chi ) ) /如果是运算符 if( S
13、.top=0 | GetTop(S)=Precedence( GetTop(S) ) ) Output.chStr.len-1-i=Pop_C(S); ) /假如是左括号,栈中运算符逐个出栈并输出 /直到遇到右括号。 while( GetTop(S)! ) while(S.top!=-1) /假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。 Output.ch+Output.len-1=Pop_C(S); return StrNeg(Output); /输出Output的逆序即为所求前缀表达式Str) /由中缀表达式生成表达式二叉树 TStack S; InitTStack(S); F=
14、Convert(Str); for(i=F.len-1 ; i-) if( !IsOperator(F.chi) ) Push_T(S , T)lchild=Pop_T( S );rchild=Pop_T( S ); Push_T(S , T);int Calc(int a, char opr, int b) /计算 switch (opr)int Value(TNode *T) /求表达式二叉树的值/*JudgeExp.h*/bool JudegExp(String Exp) /此函数验证式子是否正确,即是否符合运算规则。 char check; int error=0; int lb=0;
15、 int rb=0; if(StrLen(Exp)=1 & Exp.ch0! else if( (IsOperator(Exp.ch0)& | IsOperator( Exp.chStrLen(Exp)-1 ) ) & & Exp.chStrLen(Exp)-1! ) /此处若不加,在遇到某些式子时,会出现非法操作。 for(int m=0 ; mStrLen(Exp) ; m+) check=Exp.chm; if(m=0 & check= (IsDigit(Exp.ch1)!=0 | Exp.ch1= ) ) check=Exp.ch+m; if( IsOperand(check) ); /如果是数字,跳过,不管。 else if(IsOperator(check) if( check= rb+; if( IsOperator(Exp.chm+1)&(Exp.chm+1=|Exp.chm+1=|Exp.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1