中缀表达式求后缀,再由后缀表达式求值

人:中缀表达式

计算机:后缀表达式

需要进行中缀转后缀,再计算。无论哪一步都需栈:

对于(3 + 4) × 5 - 6

一 中缀转后缀

涉及的栈用来存储符号如“+ - × / ( )”

思想:

遇见数字输出;遇见符号入栈

当空栈或者符号是左括号时直接入栈 ;

当是运算符时将要入栈的符号需要大于栈内符号否在现将栈内比该运算符大或者等的出栈输出,然后再入栈;

当运算符是右括号时,将栈内直到第一个左括号的符号出栈,并输出非括号的符号

算法:

//中缀表达式改成后缀表达式
void mid2after(char *a, char *&b){
int l=strlen(a);
int i=0,j=0;
sqstack s;
initstack(s);
while(i<l&&s.top>=-1){
if(a[i]>='0'&&a[i]<='9'){b[j++]=a[i++];if(a[i]<'0'||a[i]>'9')b[j++]=' ';}
else{
if(s.top==-1||a[i]=='(')s.data[++s.top]=a[i++];
else if(a[i]=='*'||a[i]=='/'){while(s.data[s.top]=='*'||s.data[s.top]=='/'){b[j++]=s.data[s.top--];}s.data[++s.top]=a[i++];}
else if(a[i]=='+'||a[i]=='-')
{while(s.data[s.top]=='+'||s.data[s.top]=='-'||s.data[s.top]=='*'||s.data[s.top]=='/'){b[j++]=s.data[s.top--];}  
    s.data[++s.top]=a[i++];}
else if(a[i]==')'){i++;while(s.data[s.top]!='('){b[j++]=s.data[s.top--];}
s.top--;}
else if(a[i]==' ')i++;
else {cout<<"inlegal input!";return;}
}
}
while(s.top>-1){b[j++]=s.data[s.top--];}
}

二 后缀求值

后缀表达式求值栈主要用来存储数值

思想:

每遇见数字即入栈;

遇见运算符即出栈前两位运算,结果再入栈

注意后缀表达式木有括号。

算法:

//后缀求值
int get_after(char *b){
int l=strlen(b);
sqstack s;
initstack(s);
int i=0,ss;
while(i<l&&s.top>=-1){
 if(b[i]>='0'&&b[i]<='9'){
     ss=0;
while(b[i]>='0'&&b[i]<='9')
{ 
    int j=1;
    j=(b[i]-'0');
    ss=ss*10+j;
     i++;
    // cout<<ss<<" ";
}
   s.data[++s.top]=ss;
}
else {int t=s.data[s.top];
    switch (b[i])
    {case '+':s.data[--s.top]=s.data[s.top]+t;break;
     case '-':s.data[--s.top]=s.data[s.top]-t;break;
     case '*':s.data[--s.top]=s.data[s.top]*t;break;
     case '/':{if(t==0)return -100;s.data[--s.top]=s.data[s.top]/t;break;
              }
     case ' ':break;
    default:{cout<<"error! "<<b[i];return -100;}
    }
    i++;}
}
if(s.top>-1)return s.data[s.top];
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值