表达式求值

来源:互联网 发布:js 过滤特殊字符 编辑:程序博客网 时间:2024/06/06 00:29

输入一个表达式最后以#结束,输出表达式的结果

例如输入一个表达式 2*(5+2)#  结果为:14

<span style="font-size:18px;">#include<iostream>#include<stdlib.h> #define STACK_INT_SIZE 100#define STACKINCREMENT 10typedef double SElemType;using namespace std;typedef struct SqStack{//定义一个顺序栈的结构体 SElemType *base;SElemType *top;int stacksize;}SqStack;void InitStack(SqStack &S)//初始化 {S.base=(SElemType *)malloc(STACK_INT_SIZE*sizeof(SElemType));if(!S.base) exit(-1);S.top=S.base;S.stacksize=STACK_INT_SIZE;}bool GetTop(SqStack S, SElemType &e)//获取站顶元素 {if(S.base==S.top)return false;e=*(S.top-1);return true; }bool Push(SqStack &S, SElemType e)//入栈 {if(S.top-S.base>=S.stacksize)//判断栈是否已满 {//若栈已满在增加10个空间 S.base=(SElemType*)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.base)exit(-1);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return true;}bool Pop(SqStack &S, SElemType &e)//出栈 {if(S.base==S.top)return false;e=*--S.top;return true;}char Precede(char a1, char a2)//进行操作符优先级比较 {char r;//用来返回操作符优先级大小 switch(a2)//依据数据结构课本52页表 {case '+':case '-':switch(a1){case '(':case '#':r='<';break;case '+':case '-':case '*':case '/':case ')':r='>';break;} case '*':case '/':switch(a1){case '*':case '/':case ')':r='>';break;case '+':case '-':case '(':case '#':r='<';break;}case '(':switch(a1){case '+':case '-':case '*':case '/':case '#':case '(':r='<';break;case ')':printf("错误!没有右括号!"); exit(-1);} break;case ')':switch(a1){case '(':r='=';break;case '#':cout<<"错误!没有左括号."<<endl;  exit(-1);case '+':case '-':case '*':case '/':case ')':r='>';break;}break;case '#':switch(a1){case '#':r='=';break;case '(':cout<<"没有右括号!"<<endl;exit(-1);default:r='>';}break;} return r;} bool In(char d)//判断是否是合法的运算符 {switch(d){case '+':case '-':case '*':case '/':case '(':case ')':case '#':return true;break;default:return false;}} SElemType operate(SElemType a, SElemType theta, SElemType b)//求值操作函数 {char n=char(theta);//把double强制转换为char类行 switch(n){case '+':return a+b;case '-':return a-b;case '*':return a*b;default:if(b!=0)return a/b;else{cout<<"错误!除数为零!"<<endl;exit(-1); }}}SElemType EvaluateExpression()// {SqStack OPTR, OPND;//定义两个栈一个放操作符,一个放数字 char c;char Data[11];SElemType a,b,d,e;//初始化两个栈 InitStack(OPTR);InitStack(OPND);//操作符栈以#开始 Push(OPTR,'#');c=getchar();GetTop(OPTR,e);while(c!='#'||e!='#'){if(In(c))//判断c是不是操作符 {switch(Precede(e,c))//比较两个的优先级看栈顶的操作符和输入的 进行比较 {//如果输入的运算符优先级小于栈顶元素的就入栈继续输入元素 case '<':Push(OPTR, c);c=getchar();break;//如果输入的操作符优先级大于栈顶操作符的优先级就计算出来把值放在栈中 case '>': Pop(OPTR,e);Pop(OPND,b);Pop(OPND,a);Push(OPND,operate(a,e,b));break;//如果操作符的优先级相等的话就出栈不进行任何操作例如( 和) case '=':Pop(OPTR, e);c=getchar();break;}}//判断输入的是否是数字 同时包括小数 else if(c>='0'&&c<='9'||c=='.'){int i=0; //让它存放在数组中 while(c>='0'&&c<='9'||c=='.'){Data[i]=c;i++;c=getchar();}Data[i]='\0';//再把它转化为float类型入栈 d=atof(Data);Push(OPND,d);}else{cout<<"输入错误!"<<endl;exit(-1);}GetTop(OPTR, e);}GetTop(OPND,e);return e;}int main(){SElemType result;cout<<"请输入表达式以#结束"<<endl;result=EvaluateExpression();cout<<"结果为:"<<result<<endl;return 0; }</span>




0 0
原创粉丝点击