正文

求逆波兰表达式的值2006-05-05 19:59:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wojiele/13600.html

分享到:

求逆波兰表达式的值,即得原算术表达式的值,可实现简单四则运算 (为简单起见,设原算术表达式中参加运算的数都只有一个数字)。*/ /*2005-3-10 梁见斌*/ #include #include #include #define MAX 30 int GetStr(char str[]);/*输入算术表达式*/ void Print(char exp[], int len);/*输出表达式*/ int Change(char str[], char exp[]);/*将一般表达式转化为逆波兰表达式*/ float JiSuan(char exp[]); /*求逆波兰表达式的值*/ int main(void) { char str[MAX], *pstr=str;/*存储原算术表达式*/ char exp[MAX], *pexp=exp;/*存储转化成的逆波兰表达式*/ float result; /*存储逆波兰表达式的值*/ int len1, len2;/*len1存储原算术表达式的长度,len2存储转化成的逆波兰表达式的长度*/ len1=GetStr(pstr); printf("原算术表达式: "); Print(pstr, len1); len2=Change(pstr, pexp); printf("逆波兰表达式: "); Print(pexp,len2); result=JiSuan(pexp); printf("The result is: %f", result); system("pause"); return 0; } int GetStr(char str[]) { int i=0; printf("请输入算术表达式: "); do{ scanf("%c", &str[i++]);/*设字符‘#’为表达式的终止符*/ }while(str[i-1] != '#' && i < MAX); return i; } void Print(char exp[], int len) { int i; for(i=0; i= '0' && ch <= '9') //如果是数字,直接存入数组 exp[t++]=ch; else if(ch == '(') //如果是左括号,入栈 stack[++top]=ch; else if(ch == ')')//如果是右括号,出栈 { while(stack[top] != '(') exp[t++]=stack[top--]; top--; } else if(ch == '+' || ch == '-') //如果是操作数,根据优先级出,入栈 { while(top != 0 && stack[top] != '(') exp[t++]=stack[top--]; stack[++top]=ch; } else if(ch == '*' || ch == '/') { while(stack[top] == '*' || stack[top] == '/') exp[t++]=stack[top--]; stack[++top]=ch; } else //不理会错误字符 printf("\n%c ia a wrong letter\n", ch); ch=str[i++]; } while(top != 0) exp[t++]=stack[top--]; exp[t]='#'; return t+1; } float JiSuan(char exp[]) { float stack[MAX], d;/*作为栈使用*/ char c; int i=0, t=0, top=0; c=exp[t++]; while(c != '#') { d=c-'0'; if(c >= '0' && c <= '9') stack[top++]=d; else { switch(c) { case '+': stack[top-2]=stack[top-2]+stack[top-1]; break; case '-': stack[top-2]=stack[top-2]-stack[top-1]; break; case '*': stack[top-2]=stack[top-2]*stack[top-1]; break; case '/': if(stack[top] != 0) stack[top-2]=stack[top-2]/stack[top-1]; else printf("It's error!\n"); break; } top--; } c=exp[t++]; } return stack[top-1]; }


阅读(7068) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册