#include<iostream>
#include<cstdio>
#define size 1000
using namespace std;
inline short order(char s)
{
if(s=='(')
return 0;
else if(s==')')
return 1;
else if(s=='+'||s=='-')
return 2;
else if(s=='*'||s=='/'||s=='%')
return 3;
}
inline bool sym(char s)
{
if(s=='+'||s=='-'||s=='*'||s=='/'||s=='('||s==')'||s=='%')
return 1;
else return 0;
}
void convert(char in[],char s[])
{
int i,ps,pn;
char temps[size];
for(i=0;i<size;i++)
temps[i]=s[i]=0;
for(ps=0,pn=0,i=0;in[i]!=0;i++)
{
if(sym(in[i]))
{
s[pn++]=' ';
temps[ps]=in[i];
while(ps && order(temps[ps]) && order(temps[ps])<=order(temps[ps-1]) )
{
if(temps[ps]!=')')
{
s[pn++]=temps[ps-1];
s[pn++]=' ';
temps[ps-1]=temps[ps--];
}
else
{
while(ps--)
if(temps[ps]!='(')
{
s[pn++]=temps[ps];
s[pn++]=' ';
}
}
}
ps++;
}
else if(in[i]==' ');
else
{
s[pn++]=in[i];
}
}
for(ps--;ps>=0;ps--)
{
s[pn++]=' ';
s[pn++]=temps[ps];
}
}
void count(char s[],long long num[])
{
int i,k;
k=0;
for(i=0;i<100;i++)
num[i]=0;
for(i=0;;i++)
{
if(s[i]==0)
break;
else if(s[i]>='0'&&s[i]<='9')
num[k]=num[k]*10+s[i]-'0';
else if(s[i]==' '&&s[i-1]>='0'&&s[i-1]<='9')
k++;
else if(s[i]=='+')
{
num[k-2]+=num[k-1];
num[k-1]=0;
k--;
}
else if(s[i]=='-')
{
num[k-2]-=num[k-1];
num[k-1]=0;
k--;
}
else if(s[i]=='*')
{
num[k-2]*=num[k-1];
num[k-1]=0;
k--;
}
else if(s[i]=='/')
{
num[k-2]/=num[k-1];
num[k-1]=0;
k--;
}
else if(s[i]=='%')
{
num[k-2]%=num[k-1];
num[k-1]=0;
k--;
}
}
}
int main()
{
char in[size],result[10*size];
long long n[size];
while(gets(in))
{
convert(in,result);
count(result,n);
cout << n[0] << endl;
}
}
以上是程式碼
先把中置轉後置,再算後續運算,實在不知道問題出在哪兒