#include <stdio.h>
#include <iostream>
#include <string.h>
#include <malloc.h>
#include<math.h>
using namespace std;
void push (float *,int &,float num); //进栈函数
float pop (float *,int &,float x);//出栈函数
int balance (char *tep);//判断括弧是否匹配函数
int order (char or); //运算符的优先级数函数
float calculate2 (float val1,float val2,char op);//求两个数和函数
float calculate1 (char *,int,int &); //求表达式的值函数
//////////////////////////////////////////////////////////////////////////////////
int main ()
{
int i=0,j,m;
char tep[200];
cout<<"请输入要计算的表达式的个数"<<endl;
cin>>j;
for(m=1;m<=j;m++)//采用循环
{
cout<<"******************************"<<endl;
cout<<"请输入第"<<m<<"个要计算的表达式"<<endl;
cin>>tep;
if (balance(tep))//如果括弧匹配,则计算
{
cout<<"第"<<m<<"个要计算结果为:"<<endl;
cout<<tep<<'='<<calculate1(tep,strlen(tep),i)<<endl;
}
else
cout<<"括号不匹配!"<<endl;//括弧不匹配,报错
cout<<"******************************"<<endl;
}
return(0);
}
///////////////////////////////////////////////////////////////////////////////////
void push (float *stack,int &leng,float num)//进栈函数,将表达式的数字存入
{
leng++;
*(stack+leng)=num;
}
/////////////////////////////////////////////////////////////////////////////////////
float pop (float *stack,int &leng,float x)//出栈函数,把数字取出运算
{
x=*(stack+leng);
leng--;
return(x);
}
////////////////////////////////////////////////////////////////////////////////////
int balance (char *tep)//判断括弧是否匹配函数,匹配返回1,否则返回0
{
int c=0,i,len=strlen(tep);
for (i=0;i<len;i++)
{
if (*(tep+i)=='(') c++;
if (*(tep+i)==')')
{
if (c>0) c--;
else return(0);
}
}
if (!c) return(1);
else return(0);
}
//////////////////////////////////////////////////////////////////////////////////////
int order (char or)//运算符的优先级数函数,先计算优先级高的表达式
{
switch (or)
{
case '+': case '-': return(12);
case '*': case '/': case '%':return(13);
case ';': case '\0': case ')':return(1);
}
return(-1);
}
/////////////////////////////////////////////////////////////////////////////////////
float calculate2 (float val1,float val2,char op)//求两个数和函数
{
switch (op)
{
case '+': return(val1+val2);
case '-': return(val1-val2);
case '*': return(val1*val2);
case '/': return(val1/val2);
};
return(-1);
}
//////////////////////////////////////////////////////////////////////////////////
float calculate1 (char *tep,int len,int &k)//计算表达式的值函数
{
int nop=0,nval=-1;
float *ns,val1,val2,temp;
char *os,op,opin;
ns=(float *)malloc(len*sizeof(int));
os=(char *)malloc(len*sizeof(char));
*os=';';
*ns=0;
while ((*(tep+k))!='\0' || nval>0)
{
if ((*(tep+k))=='(')
{
k++;
push(ns,nval,calculate1(tep,len-k,k));
}
else
{
if ((*(tep+k))==')' && nval==0) k++;
else
{
if (47<(*(tep+k)) && (*(tep+k))<58)
{
temp=0;
do
{
temp=temp*10+((float)(*(tep+k))-48);
k++;
}
while (47<(*(tep+k)) && (*(tep+k))<58);
push(ns,nval,temp);
}
else
{
opin=*(os+nop);
op=(*(tep+k));
if (order(opin) >= order(op))
{
val1=*(ns+nval-1);
val2=pop(ns,nval,val2);
*(ns+nval)=calculate2(val1,val2,opin);
nop--;
}
else
{
k++;
nop++;
*(os+nop)=op;
};
};
};
};
};
temp=*ns;
return(temp);
}
///////////////////////////////////////////////////////////////////////////////////////////////
评论0