中缀转后缀表达式,以及表达式的值

来源:互联网 发布:java线程池使用demo 编辑:程序博客网 时间:2024/06/04 20:10
#include <cstdio>#include <stack>#include <cstring>#include <ctype.h>using namespace std;typedef double YP;int precede(char ch1,char ch2){    if(ch1 == '*'||ch1 == '/'){    return 0;}else if(ch1 == '+'||ch1 == '-'){    if(ch2 == '*'||ch2 == '/')        return 1;    else if(ch2 == '+'||ch2 == '-')        return 0;}else if(ch1 == '(')    return 1;}YP calculate(char *shu){    int i;    stack<YP> uk;    for(i = 0;i < strlen(shu);i++)    {        if(isdigit(shu[i])) uk.push(shu[i] - '0');        else        {            switch(shu[i])            {                case '+':{                    YP a = uk.top();                    uk.pop();                    YP b = uk.top();                    uk.pop();                    YP c = b + a;                    uk.push(c);                    break;                }                case '*':{                    YP a = uk.top();                    uk.pop();                    YP b = uk.top();                    uk.pop();                    YP c = b * a;                    uk.push(c);                    break;                }                case '/':{                    YP a = uk.top();                    uk.pop();                    YP b = uk.top();                    uk.pop();                    YP c = b / a;                    uk.push(c);                    break;                }                default:break;            }        }    }    YP k = uk.top();    uk.pop();    return k;}int main(){    char s[100];    char shu[100];    scanf("%s",s);    stack<char> ck;    int k = 0;    // for(int i = 0;i < strlen(s);i++)    // if(isdigit(s[i]))printf("%c",s[i]);    //    // printf("\n");    for(int i = 0;i < strlen(s);i++)    {        if(isdigit(s[i]))        {            printf("%c",s[i]);            shu[k++] = s[i];        }        else if(s[i] == '(') ck.push(s[i]);        else if(s[i] == ')')        {        char ch = ck.top();        while(ch != '(')        {        printf("%c",ch);        shu[k++] = ch;        ck.pop();        ch = ck.top();        }        ck.pop();        }        else        {            if(ck.empty()) ck.push(s[i]);            else if(precede(ck.top(),s[i]))            ck.push(s[i]);            else            {                while( !ck.empty() &&!precede(ck.top(),s[i]))                {                printf("%c",ck.top());                shu[k++] = ck.top();                ck.pop();                }                ck.push(s[i]);                }        }    }    while(!ck.empty())    {        printf("%c",ck.top());        shu[k++] = ck.top();        ck.pop();    }    // for(int i = 0;i < k;i++)    // printf("%c",shu[i]);    printf("\n");    printf("%f \n",calculate(shu));    return 0;}
0 0
原创粉丝点击