等价表达式

这道题若老老实实的因式分解是会超时的
所以我们可以给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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值