#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
stack <char> operat;
stack <double> data;
double stof1(char* num){
int i = 0,k1 =1,l=strlen(num);
double k2=1.0,s=0.0,z=0.0,x=0.0;
while(i<l){
if(num[i]=='.') break;
i++;
}
for(int j=i-1;j>=0;j--){
z+=k1*(num[j]-'0');
k1*=10;
}
for(int k=i+1;k<l;k++){
k2/=10;
x+=k2*(num[k]-'0');
}
return z+x;
}
int pr(char a,char b){
if(a=='('||b=='(') return 1;
else if((a=='+'||a=='-')&&(b=='*'||b=='/')) return 1;
else if(a=='#'&&b!='#') return 1;
return 0;
}
void baseop(){
char a =operat.top();
double n,m;
switch(a){
case '+':
{
n=data.top();
data.pop();
m=data.top();
data.pop();
m+=n;
data.push(m);break;
}
case '-':
{
n=data.top();
data.pop();
m=data.top();
data.pop();
m-=n;
data.push(m);break;
}
case '*':
{
n=data.top();
data.pop();
m=data.top();
data.pop();
m*=n;
data.push(m);break;
}
case '/':
{
n=data.top();
data.pop();
m=data.top();
data.pop();
m/=n;
data.push(m);break;
}
}
operat.pop();
}
double solve(char* a){
int l = strlen(a);
for(int i=0;i<l;i++){
if('0'<=a[i]&&a[i]<='9'){
char j[1000];
int k=0;
while(a[i]>='0'&&a[i]<='9'||a[i]=='.'){
sprintf(j+(k++),"%c",a[i++]);
}
double s = stof1(j);
data.push(s); i--;
}
else while(!operat.empty()){
if(a[i]==')'&&operat.top()=='('||(a[i]=='#'&&operat.top()=='#')){
operat.pop();
break;
}
else if(pr(operat.top(),a[i])){
operat.push(a[i]);break;
}
else baseop();
}
}
return data.top();
}
int main(){
operat.push('#');
char a[1000];
scanf("%s",a);
strcat(a,"#");
printf("%lf",solve(a));
return 0;
}
表达式求值
最新推荐文章于 2025-05-15 16:19:52 发布