c++用2个栈,中缀法表达式求值
不知道错在哪了
#include <bits/stdc++.h>
using namespace std;
stack<char>oprt;
stack<double>opnd;
char f[1000]={'\0'};
double num[1000]={0};
char Compare(char a,char b)
{
switch(a)
{
case '+':switch(b)
{
case '+':return '>';
case '-':return '>';
case '*':return '<';
case '/':return '<';
case '(':return '<';
case ')':return '>';
case '#':return '>';
}
case '-':switch(b)
{
case '+':return '>';
case '-':return '>';
case '*':return '<';
case '/':return '<';
case '(':return '<';
case ')':return '>';
case '#':return '>';
}
case '*':switch(b)
{
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '(':return '<';
case ')':return '>';
case '#':return '>';
}
case '/':switch(b)
{
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '(':return '<';
case ')':return '>';
case '#':return '>';
}
case '(':switch(b)
{
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '(':return '<';
case ')':return '=';
}
case ')':switch(b)
{
case '+':return '>';
case '-':return '>';
case '*':return '>';
case '/':return '>';
case '(':return '=';
case ')':return '>';
case '#':return '>';
}
case '#':switch(b)
{
case '+':return '<';
case '-':return '<';
case '*':return '<';
case '/':return '<';
case '(':return '<';
case ')':return '<';
case '#':return '=';
}
}
}
double Operat(double a,char b,double c)
{
switch(b)
{
case '+':return a+c;
case '-':return a-c;
case '*':return a*c;
case '/':return a/c;
}
}
double Translation(char a[])
{
int len,i,j,k;
double sum=0,t;
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i]!='.')
{
t=a[i]-'0';
sum=sum*10+t;
}
else
{
j=i;
break;
}
}
for(i=j+1;i<len;i++)
{
t=a[i]-'0';
for(k=0;k<i-j;k++)
{
t*=0.1;
}
sum+=t;
}
return sum;
}
void Fun(char a[])
{
int i,j=0,k,m=0,n=0,len;
char s[1000];
len=strlen(a);
for(i=0;i<len;i++)
{
if(a[i]!='.'&&(a[i]<'0'||a[i]>'9'))
{
f[j++]=a[i];
}
else
{
for(k=i;k<len;k++)
{
if(a[k]!='.'&&(a[k]<'0'||a[k]>'9'))
{
i=k;
num[n++]=Translation(s);
break;
}
else
{
s[m++]=a[k];
}
}
}
}
}
double Evaluateexpression()
{
int i=0,j=1;
double a,c;
char b;
opnd.push(num[0]);
oprt.push('#');
while(!oprt.empty())
{
switch(Compare(oprt.top(),f[i++]))
{
case '<':
opnd.push(num[j++]);
oprt.push(f[i]);
break;
case '>':
c=opnd.top();
b=oprt.top();
opnd.pop();
oprt.pop();
a=opnd.top();
opnd.pop();
opnd.push(Operat(a,b,c));
break;
case '=':
oprt.pop();
break;
}
}
return opnd.top();
}
int main()
{
char expression[1000];
int i,j,k,len;
cin>>expression;
len=strlen(expression);
if(expression[0]=='-')
{
for(i=len;i>0;)
{
expression[i]=expression[--i];
expression[0]='0';
}
len++;
}
for(i=1;i<len;i++)
{
if((expression[i-1]=='('||expression[i-1]==')')&&expression[i]=='-')
{
for(j=len;j>i;)
{
expression[j]=expression[--j];
}
expression[i]='0';
}
}
Fun(expression);
cout<<Evaluateexpression()<<endl;
}