表达式求值
来源:互联网 发布:淘宝用户名是会员名吗 编辑:程序博客网 时间:2024/06/06 16:23
#include<cstdio>#include<cstring>#include<cstdlib>using namespace std;//two steps solving the problem:1.transfer the infixexpression to the postfixexpression// 2.using a stack to calculate the value of the infixexperssion.double readnumber(char f[],int *i){ double x=0.0; int k=0; while(f[*i]>='0'&&f[*i]<='9') x=10*x+(f[(*i)++]-'0');//处理整数部分 if(f[*i]=='.'){//处理小数部分 (*i)++; while(f[*i]>='0'&&f[*i]<='9'){ x=x*10+(f[(*i)++]-'0'); k++; } } while(k--){ x/=10.0; } return x;}double evalpost(char f[]){ double obst[100];/*操作数栈*/ int top=0; int i=0; double x1,x2; while(f[i]!='#'){ if(f[i]>='0'&&f[i]<='9') obst[top++]=readnumber(f,&i); else if(f[i]==' ') i++; else{ x2=obst[--top]; x1=obst[--top]; if(f[i]=='+') obst[top]=x1+x2; else if(f[i]=='-') obst[top]=x1-x2; else if(f[i]=='*') obst[top]=x1*x2; else if(f[i]=='/') obst[top]=x1/x2; i++; top++; } } return obst[0];}int priority(char op){ switch (op) { case '#':return -1;//在比较操作符优先级时,保证栈不空 case '(':return 0;//当栈顶元素为(时运算符入栈 case '+': case '-':return 1; case '*': case '/':return 2; default:return -1; }}int is_operation(char op){ switch (op) { case '+': case '-': case '*': case '/':return 1; default:return 0; }}void postfix(char *e,char *f){ int i=0,j=0,top=1,t; char opst[100]; opst[0]='#'; while(e[i]!='#'){ if((e[i]>='0'&&e[i]<='9')||(e[i]=='.')) f[j++]=e[i];//遇到数字和小数点直接写入后缀表达式 else if(e[i]=='(') opst[top++]=e[i];//遇到左括号进入操作符栈 else if(e[i]==')'){ t=top-1;//遇到右括号将其对应的左括号后的操作符号全部写入后缀表达式 while(opst[t]!='('){ f[j++]=opst[t]; t--; } top=t;//左括号出栈 } else if(is_operation(e[i])){ f[j++]=' ';//用空格分开两个操作数 while(priority(opst[top-1])>=priority(e[i])) f[j++]=opst[--top]; opst[top++]=e[i];//当前元素进栈 } i++;//处理下一个元素 } while(top) f[j++]=opst[--top]; f[j]=0;}int main(){ char s[100],ts[100]; int n; printf("please input the number of expressions you want to calculate:\n"); scanf("%d",&n); getchar(); while(n--){ printf("please input your expressions(end with'#'):\n"); gets(s); postfix(s,ts); //printf("%s\n",ts); printf("the answer is: %f\n",evalpost(ts)); } return 0;}
说明:本文大部分内容来自《数据结构(C语言版)》(李云清、杨庆红、揭安全编著),写此文只为备忘,转载请留此说明,谢谢。