资源预览内容
第1页 / 共20页
第2页 / 共20页
第3页 / 共20页
第4页 / 共20页
第5页 / 共20页
第6页 / 共20页
第7页 / 共20页
第8页 / 共20页
第9页 / 共20页
第10页 / 共20页
亲,该文档总共20页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
后缀表达式算法:用栈对后缀表达式求值的算 法 疯狂代码 http:/CrazyCoder.cn/ :http:/CrazyCoder.cn/VC/Article21725.html 第种 /* 此功能是求出用户输入整形表达式值*/ /*输入表达式请用#结尾比如:2+3+5应输入:2+3+5#*/ # # MAXSIZE 16 typedef struct dataMAXSIZE; top; base; seqstack; /* 顺序栈定义*/ /*以下为声明*/ void InitStack(seqstack *); Empty(seqstack *); void Push(seqstack *, ); Pop(seqstack *); GetTop(seqstack *); Operate( ,char , ); char Proceed(char ,char ); In(char ); EvalExpres(void); /* 定义两个栈分别存放运算符和操作数*/ seqstack StackR,StackD; /*主*/ v; char ch; while(1) prf(“end with #,for example 2+3+5 input:2+3+5#n“); prf(“calculate:“) ; v = EvalExpres; prf(“The result is:%d“,v); /*以下为控制*/ prf(“nInput q to quit and ENTER run again:“); do scanf(“%c“, (ch q | ch Q) exit(0); while(ch!=n); system(“cls“); 0; void InitStack(seqstack *s) s-top = 0; s-base = 0; /* 化栈*/ Empty(seqstack *s) (s-top s-base) 1; 0; /* 判断栈是否为空*/ void Push(seqstack *s, x) (s-top MAXSIZE) prf(“OVER FLOW!n“); exit(0); s-datas-top = x; s-top; /* 进栈 */ Pop(seqstack *s) e; (Empty(s) prf(“Under flow!n“); 0; /* 下溢*/ s-top-; e = s-datas-top; e; /* 出栈*/ GetTop(seqstack *s) /*取栈顶元素*/ (Empty(s) prf(“Under flow!n“); 0; s-datas-top-1; EvalExpres(void) /* 表达式求解*/ a,b,i=0,s=0; char c80,r; InitStack( Push( InitStack( prf(“ end with #“); gets(c); while(ci!=# | GetTop( a = Pop( b = Pop( Push( ; (GetTop( /* 返回运算结果*/ In(char c) /*问题2:解决In问题:判断C是否为运算符是返回1否则返回0*/ char ch7=+,-,*,/,#,(,); i; for(i = 0; i ; ; *: /: (: ch = ; ; (: ch = ; ; (: prf(“Error!n“); exit(0); (op#) /*栈顶元素为#时候*/ switch(c) +: -: *: /: (: ch = # # MaxSize 50 void trans(char *exp,char *postexp) struct char dataMaxSize; top; op; i=0; op.top=-1; while(*exp!=0) switch(*exp) (: op.top;op.dataop.top=*exp; exp; ): while(op.dataop.top!=() postexpi=op.dataop.top; op.top-; op.top-;exp; +: -: while(op.top!=-1 op.top-; op.top;op.dataop.top=*exp;exp; *: /: while(op.dataop.top*|op.dataop.top/) postexpi=op.dataop.top; op.top-; op.top;op.dataop.top=*exp;exp; :; default: while(*exp=0 top; seqstack; seqstack *s; seqstack *Init /*栈化*/ seqstack *s; s=(seqstack *)malloc(seqstack); (!s) prf(“FULL!“); NULL; s-top=-1; s; Empty(seqstack *s) /*栈空判断*/ (s-top-1) 1; 0; Push(seqstack *s, x) /*入栈*/ (s-topMAXSIZE-1) 0; s-top; s-datas-top=x; 1; Pop(seqstack *s, *x) /*出栈算法*/ (Empty(s) 0; *x=s-datas-top; s-top-; 1; Top(seqstack *s) /*取栈顶元素*/ (Empty(s) 0; s-datas-top; eval(char t, a1, a2) switch(t) add:(a1+a2); subs:(a1-a2); mult:(a1*a2); div:(a1/a2); void char c; op1,op2,temp,c1; s=Init; prf(“Input:(end with #)n“); while(c=getchar)!=#) (c)continue; (c47 top; STKzone; typedef STKzone *STK; typedef enumture=1,false=0 bool; typedef enumok,error status; STKzone expSTKzone; STK expSTK; STK initSTK(STKzone *stkzone) /*栈化*/ STK p; p=stkzone; p-top=0; status push( *term,STK pstk) /*入栈*/*term前可以没有*同时将第28、71、81行稍作修改即可 */ (pstk-topMAXSIZE) error; pstk-datapstk-top=*term; pstk-top; ok; bool emptySTK(STK pstk) /*栈空判断*/ (pstk-top0); status pop( *pdata,STK pstk) /*出栈算法*/ (emptySTK(pstk) error; (pstk-top)-; *pdata=pstk-datapstk-top; ok; void synerror prf(“nyu fa cuo wu!“); eval(char tag, a1, a2) switch(tag) add:(a1+a2); subs:(a1-a2); mult:(a1*a2); div:(a1/a2); char c; op1,op2,temp,c1; expSTK=initSTK( prf(“Input:n“); while(c=getchar)!=n) (c)continue; (c47 top; stack; init_stack(stack *s) s=(stack *)malloc(stack); (!s) prf(“FULL!n“); 0; s-top=-1; 1; push(stack *s, x) (s-topMAXSIZE-1) prf(“over flown“); 0; s-top; s-stkdatas-top=x; 1; char pop(stack *s) char e; (s-top-1) prf(“under flow n“); 0; e=s-stkdata(s-top)-; e; void stack *s1; length,i,num1,num2,result,sum; char s100; init_stack(s1); prf(“please input n“); prf(“warning:must less than 100n“); gets(s); length=strlen(s); for(i=0;i=1 prf(“result is %dn“,result); getch; 2009-2-12 5:12:34 疯狂代码 http:/CrazyCoder.cn/
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号