这道题若老老实实的因式分解是会超时的
所以我们可以给A带一个值,然后判断两式的值是否相等
但这样可能会有重复,所以可以多次判断是否相等
首先要把中序表达式转成后序表达式
弄两个栈
一个后序栈,一个暂时符号栈
1.当当前为运算符号时,判断栈顶优先级是否大于等于该符号
若是,则弹出至后序栈 直到不满足
然后把当前运算符放进符号栈
2.当为左括号时,放入符号栈
3.当为右括号时,弹出符号栈内符号至后序栈 直至遇到左括号
4.若为数字,直接丢进后序栈
5.读完式子后,把符号栈中的剩余元素依次放入后序栈中
代码实现:
FOR(i,0,n-1) {
if(A[i]==' ')continue;
if((A[i]<'0'||A[i]>'9')&&now){S[++r]=now;now=0;}
if(A[i]>='0'&&A[i]<='9')now=now*10+A[i]-'0';
else if(A[i]=='a')S[++r]=t;
else if(A[i]=='(')re[++r1]='(';
else if(A[i]==')') {
while(re[r1]!='(') {
int d;
if(re[r1]=='+')d=-1;
else if(re[r1]=='-')d=-2;
else if(re[r1]=='*')d=-3;
else if(re[r1]=='/')d=-4;
else d=-5;
S[++r]=d;
r1--;
}
r1--;
} else {
while(re[r1]!='('&&Mark(re[r1])>=Mark(A[i])&&r1>0) {
int d;
if(re[r1]=='+')d=-1;
else if(re[r1]=='-')d=-2;
else if(re[r1]=='*')d=-3;
else if(re[r1]=='/')d=-4;
else d=-5;
S[++r]=d;
r1--;
}
re[++r1]=A[i];
}
}
if(now){S[++r]=now,now=0;}
while(r1) {
int d;
if(re[r1]=='+')d=-1;
else if(re[r1]=='-')d=-2;
else if(re[r1]=='*')d=-3;
else if(re[r1]=='/')d=-4;
else d=-5;
S[++r]=d;
r1--;
}
然后取出建一个数字栈
将后序栈的元素依次从栈尾取出,直至栈顶为符号后
把数字栈中的前两个元素拿出与符号栈中的栈尾符号运算
再把运算答案放入数字栈中
代码实现:
while(l1<=r) {
int a,b;
while(S[l1]>=0&&l1<=r) {
D[++l]=S[l1];
l1++;
}
b=D[l],l--;
if(l==0)return b;
a=D[l],l--;
ll c=cal(a,b,S[l1]);
l1++;
D[++l]=c;
}