思路:
这道题目首先要解决的是理解前缀表达式
前提:随便给一个前缀表达式都能看懂+能手算
不难发现,把这一串表达式依次push到栈里面,一旦一个符号后面跟着两个数字就直接进行计算,然后替代符号的位置
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int maxx=-0x3f3f3f3f;
char s[1111];
double a[1111];
double ans;
struct DATA
{
bool fuhao;
double shuzi;
};
struct STACK
{
int cnt;
DATA data[1111111];
void init()
{
cnt=0;
}
double top()
{
return data[cnt].shuzi;
}
double top1()
{
return data[cnt-1].shuzi;
}
double top2()
{
return data[cnt-2].shuzi;
}
int size()
{
return cnt;
}
void pop()
{
cnt--;
}
void push(const double &x)
{
cnt++;
data[cnt].shuzi=x;
}
}st;
int main()
{
gets(s);
int l=strlen(s);
//cout<<l<<endl;
int cntt=1;
for(int i=0;i<l;i++)
{
//cout<<"s[i]="<<s[i]<<endl;
if(s[i]==' ') continue;
if(s[i]=='+')
{
a[cntt]=-1;
cntt++;
continue;
}
if(s[i]=='-')
{
a[cntt]=-2;
cntt++;
continue;
}
if(s[i]=='*')
{
a[cntt]=-3;
cntt++;
continue;
}
if(s[i]=='/')
{
a[cntt]=-4;
cntt++;
continue;
}
double tempx=0,tempy,cnt=0,flag=0;
if(s[i]>='0'&&s[i]<='9')
{
flag=1;
tempx=tempx*10+s[i]-'0';
while(s[i+1]!=' '&&i!=l-1)
{
if(s[i+1]=='.')
{
i++;
cnt++;
}
if(s[i+1]>='0'&&s[i+1]<='9')
{
i++;
if(cnt==0) tempx=tempx*10+s[i]-'0';
else
{
tempy=s[i]-'0';
for(int j=1;j<=cnt;j++)
{
tempy/=10;
}
cnt++;
tempx+=tempy;
}
}
}
}
//cout<<"tempx="<<tempx<<endl;
if(flag)
{
a[cntt]=tempx;
cntt++;
}
}
//for(int i=1;i<cntt;i++) cout<<a[i]<<" ";
//cout<<endl;
//cout<<st.data[5]<<endl;
for(int i=1;i<cntt;i++)
{
st.push(a[i]);
if(a[i]<0)
{
st.data[st.size()].fuhao=1;
//cout<<"fuhao"<<st.size()<<endl;
}
while(st.size()>=3&&st.data[st.size()].fuhao==0&&st.data[st.size()-1].fuhao==0&&st.data[st.size()-2].fuhao==1)
{
double ans=0;
if(st.top2()==-1)
{
ans=st.top()+st.top1();
}
if(st.top2()==-2)
{
ans=st.top1()-st.top();
}
if(st.top2()==-3)
{
ans=st.top1()*st.top();
}
if(st.top2()==-4)
{
ans=st.top1()/st.top();
}
st.pop();
st.pop();
st.pop();
st.push(ans);
st.data[st.size()].fuhao=0;
//cout<<ans<<endl;
//cout<<"st.size()"<<st.size()<<endl;
}
}
if(st.size()==1) printf("%.6f",st.top());
return 0;
}