对拍找不出错。
而且是后缀表达式处理部分出错了,前面转换部分没错。
4 个关注。
#include <bits/stdc++.h>
typedef long long ll;
using std::cin;
using std::cout;
const int maxn=205;
// zhongzhui -> hou zhui shu zu
char s[maxn];
char sta[maxn];
int statop;
// houzhuishuzu
union Node
{
ll val;
char op;
}houzhuistr[maxn],temp[maxn];
int houzhuitop,temptop;
// input
int n;
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1;i<=n;i++)
{
if(s[i]=='-'&&(s[i-1]=='('||i==1))
{
houzhuistr[++houzhuitop].val=-(s[i+1]-'0');
i++;
}
else if(isdigit(s[i]))
{
houzhuistr[++houzhuitop].val=s[i]-'0';
}
else
{
if(s[i]=='(')
{
sta[++statop]=s[i];
}
if(s[i]=='+'||s[i]=='-')
{
while(sta[statop]=='-'||sta[statop]=='+'||sta[statop]=='*'||sta[statop]=='/'||sta[statop]=='^')
{
houzhuistr[++houzhuitop].op=sta[statop];
statop--;
}
sta[++statop]=s[i];
}
if(s[i]=='*'||s[i]=='/')
{
while(sta[statop]=='*'||sta[statop]=='/'||sta[statop]=='^')
{
houzhuistr[++houzhuitop].op=sta[statop];
statop--;
}
sta[++statop]=s[i];
}
if(s[i]=='^')
{
sta[++statop]=s[i];
}
if(s[i]==')')
{
while(sta[statop]!='(')
{
houzhuistr[++houzhuitop].op=sta[statop];
statop--;
}
statop--;
}
}
}
while(statop>=1)
{
houzhuistr[++houzhuitop].op=sta[statop];
statop--;
}
statop=0;
for(int i=1;i<=houzhuitop;i++)
{
if(houzhuistr[i].op=='+'||houzhuistr[i].op=='-'||houzhuistr[i].op=='*'||houzhuistr[i].op=='/'||houzhuistr[i].op=='^')
{
printf("%c ",houzhuistr[i].op);
}
else printf("%lld ",houzhuistr[i].val);
}
putchar(10);
while(houzhuitop>1)
{
bool isoped=0;
for(int i=1;i<=houzhuitop;i++)
{
if(houzhuistr[i].op=='+')
{
if(!isoped)
{
ll num=ll(temp[temptop-1].val)+ll(temp[temptop].val);
temp[temptop-1].val=num;
temptop--;
isoped=1;
}
else temp[++temptop].op='+';
}
else if(houzhuistr[i].op=='-')
{
if(!isoped)
{
ll num=ll(temp[temptop-1].val)-ll(temp[temptop].val);
temp[temptop-1].val=num;
temptop--;
isoped=1;
}
else temp[++temptop].op='-';
}
else if(houzhuistr[i].op=='*')
{
if(!isoped)
{
ll num=1ll*temp[temptop-1].val*1ll*temp[temptop].val;
temp[temptop-1].val=num;
temptop--;
isoped=1;
}
else temp[++temptop].op='*';
}
else if(houzhuistr[i].op=='/')
{
if(!isoped)
{
ll num=ll(temp[temptop-1].val)/ll(temp[temptop].val);
temp[temptop-1].val=num;
temptop--;
isoped=1;
}
else temp[++temptop].op='/';
}
else if(houzhuistr[i].op=='^')
{
if(!isoped)
{
ll num=1;
for(int cnt=1;cnt<=temp[temptop].val;cnt++)
{
num=num*1ll*temp[temptop-1].val;
}
temp[temptop-1].val=num;
temptop--;
isoped=1;
}
else temp[++temptop].op='^';
}
else
{
temp[++temptop].val=houzhuistr[i].val;
}
}
for(int i=1;i<=temptop;i++)
{
houzhuistr[i]=temp[i];
if(temp[i].op=='+'||temp[i].op=='-'||temp[i].op=='*'||temp[i].op=='/'||temp[i].op=='^')
{
printf("%c ",temp[i].op);
}
else printf("%lld ",temp[i].val);
}
houzhuitop=temptop;
temptop=0;
putchar(10);
}
return 0;
}