计算器处理程序(逆波兰)

题目:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。Input测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。Output对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。Sample Input1 + 24 + 2 * 5 ...
摘要由CSDN通过智能技术生成

题目:

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36

分析:

此题,基本思路是将中缀表达式转化为后缀表达式。从而用压栈出栈的方式,进行处理。

#include"stdio.h"
#include"string.h"
#define MAX_lenght 10000
double atof1(char str[MAX_lenght])/*将字符串转化为double型的数*/
{
    double f,f1;
    int i,l;
    double n;
    l=strlen(str);
    f=0;
    f1=0;
    i=0;

    while(str[i]!='.'&&i<l)
    {
        f=f*10+(str[i]-'0');
        i++;
    }

    n=10;
    while(i<l)
    {
        f1=f1+(str[i]-'0')/n;
        n=n*10;
        i++;
    }
// printf("f=%0.2lf\n",f+f1);
    return f+f1;
}
typedef struct
{
    double data[MAX_lenght];
    int top;
} SqStack;//数字的存入。
typedef struct
{
    char data[MAX_lenght];
    int top;
} SqStackchar;//符号的存入
SqStack S;
SqStackchar Symbol;
void PUSHchar(char t)
{
    if(Symbol.top==MAX_lenght-1)
        printf("SqStack more ERROR\n");
    else
    {
        Symbol.top++;
        Symbol.data[Symbol.top]=t;

    }
}
void POPchar(char *t)
{
    if(Symbol.top==-1)
        printf("SqStackSymbol less ERROR\n");
    else
    {
        *t=Symbol.data[Symbol.top];
        Symbol.top--;
    }
}
void PUSH(double e)
{
    if(S.top==MAX_lenght-1)
        printf("SqStack more ERROR\n");
    else
    {
        S.top++;
        S.data[S.top]=e;

    }
}
void POP(double *e)
{
    if(S.top==-1)
        printf("SqStack less ERROR\n");
    else
    {
        *e=S.data[S.top];
        S.top--;
    }
}
int main()
{
    char c,t,SM;
    double e,a,b;
    char str[MAX_lenght];
    int i,q;

    /*   这里是一开始模拟后缀表达式的计算过程所写的
    scanf("%c",&c);
    while(c!='#')
    {
        while(c>='0'&&c<='9')//这里是对数字的处理过程,将一个数字转化为double型
        {
            str[i++]=c;
            str[i]='\0';
            scanf("%c",&c);
            if(c==' ')//该数字结束
            {
                e=atof1(str);

                PUSH(e);
                i=0;
                break;
            }
        }

        switch(c)//四则运算
        {
        case '+':
            POP(&a);
            POP(&b);
            PUSH(a+b);
            break;
        case '-':
            POP(&a);
            POP(&b);
            PUSH(b-a);
            break;
        case '*':
            POP(&a);
            POP(&b);
            PUSH(a*b);
            break;
        case '/':
            POP(&a);
            POP(&b);
            if(a==0)
            {
                printf("a=0了,除数不能为0;\n");
                return -1;
            }
            else
                PUSH(b/a);
            break;
        }
        scanf("%c",&c);
    }
    POP(&a);
    printf("%0.2lf\n",a);
    */
    q=0;
    while(1)//多组
    {
         S.top=-1;
         Symbol.top=-1;
         i=0;
    scanf("%c",&c);
    if(c=='0')/*这里是需要判断是否第一个为0且这一行只有一个0。则程序结束。需要注意的是不能直接break。因为,这一会如果不止一个0的话,程序是不能结束的。*/
        q=1;
    while(c!='\n')//到达换行则一组数据结束。
    {
        while(c>='0'&&c<='9')//这里是对数字的处理过程,将一个数字转化为double型
        {
            str[i++]=c;
            str[i]='\0';
            scanf("%c",&c);
            if(c==' '||c=='\n')//该数字结束
            {
                e=atof1(str);

                PUSH(e);
                i=0;
                break;
            }
        }//1 + 2 + 3 #
        switch(c)//对四个符号的处理。
        {
        case  '+':
            {
            SM=0;
            while(Symbol.top!=-1)//如果不是第一个符号了, 则需要将之前的符号取出进行运算
            {     POPchar(&SM);
                  if(SM=='(')
                        break;
                switch(SM)//四则运算
                {
                case '+':
                    POP(&a);
                    POP(&b);
                    PUSH(a+b);
                    break;
                case '-':
                    POP(&a);
                    POP(&b);
                    PUSH(b-a);
                    break;
                case '*':
                    POP(&a);
                    POP(&b);
                    PUSH(a*b);
                    break;
                case '/':
                    POP(&a);
                    POP(&b);
                    if(a==0)
                    {
                        printf("a=0了,除数不能为0;\n");
                        return -1;
                    }
                    else
                        PUSH(b/a);
                    break;
                }



            }
            if(SM=='(')//如果是因为SM=‘(‘退出的,SM是还需要的进栈的。
                PUSHchar(SM);
            PUSHchar(c);
        }
        break;
        case '-':
           {SM=0;
            while(Symbol.top!=-1)
            {   POPchar(&SM);
                  if(SM=='(')
                        break;
                switch(SM)//四则运算
                {
                case '+':
                    POP(&a);
                    POP(&b);
                    PUSH(a+b);
                    break;
                case '-':
                    POP(&a);
                    POP(&b);
                    PUSH(b-a);
                    break;
                case '*':
                    POP(&a);
                    POP(&b);
                    PUSH(a*b);
                    break;
                case '/':
                    POP(&a);
                    POP(&b);
                    if(a==0)
                    {
                        printf("a=0了,除数不能为0;\n");
                        return -1;
                    }
                    else
                        PUSH(b/a);
                    break;
                }

            }
            if(SM=='(')
                PUSHchar(SM);
            PUSHchar(c);
            }
            break;
        case '*':
        {   SM=0;
            while(Symbol.top!=-1)
            { POPchar(&SM);
                  if(SM=='('||SM=='+'||SM=='-')
                        break;
                switch(SM)//四则运算
                {
                case '+':
                    POP(&a);
                    POP(&b);
                    PUSH(a+b);
                    break;
                case '-':
                    POP(&a);
                    POP(&b);
                    PUSH(b-a);
                    break;
                case '*':
                    POP(&a);
                    POP(&b);
                    PUSH(a*b);
                    break;
                case '/':
                    POP(&a);
                    POP(&b);
                    if(a==0)
                    {
                        printf("a=0了,除数不能为0;\n");
                        return -1;
                    }
                    else
                        PUSH(b/a);
                    break;
                }

            }
            if(SM=='('||SM=='-'||SM=='+')
                PUSHchar(SM);
            PUSHchar(c);
            }
            break;
        case '/':
            {SM=0;
             while(Symbol.top!=-1)
            {POPchar(&SM);
                  if(SM=='('||SM=='+'||SM=='-')
                        break;
                switch(SM)//四则运算
                {
                case '+':
                    POP(&a);
                    POP(&b);
                    PUSH(a+b);
                    break;
                case '-':
                    POP(&a);
                    POP(&b);
                    PUSH(b-a);
                    break;
                case '*':
                    POP(&a);
                    POP(&b);
                    PUSH(a*b);
                    break;
                case '/':
                    POP(&a);
                    POP(&b);
                    if(a==0)
                    {
                        printf("a=0了,除数不能为0;\n");
                        return -1;
                    }
                    else
                        PUSH(b/a);
                    break;
                }

            }
            if(SM=='('||SM=='-'||SM=='+')
                PUSHchar(SM);
            PUSHchar(c);}
            break;
        case ')':
            {
            while(Symbol.top!=-1)
            {  POPchar(&SM);
                  if(SM=='(')
                        break;
                switch(SM)//四则运算
                {
                case '+':
                    POP(&a);
                    POP(&b);
                    PUSH(a+b);
                    break;
                case '-':
                    POP(&a);
                    POP(&b);
                    PUSH(b-a);
                    break;
                case '*':
                    POP(&a);
                    POP(&b);
                    PUSH(a*b);
                    break;
                case '/':
                    POP(&a);
                    POP(&b);
                    if(a==0)
                    {
                        printf("a=0了,除数不能为0;\n");
                        return -1;
                    }
                    else
                        PUSH(b/a);
                    break;
                }

            }
         //   PUSHchar(c); 1 + 2 * ( 5 - 3 ) #
            }
            break;

        }
       if(c=='(')
         {PUSHchar(c);

         }
     if(c=='\n')
        break;
     scanf("%c",&c);

    }
          if(Symbol.top==-1&&S.top==0&&q==1)/*这里是判断是否是第一个0且这行只有一个0的情况*/
             break;
            while(Symbol.top!=-1)//将符号栈中的符号取出,进行运算。
            { POPchar(&SM);

                switch(SM)//四则运算
                {
                case '+':
                    POP(&a);
                    POP(&b);
                    PUSH(a+b);
                    break;
                case '-':
                    POP(&a);
                    POP(&b);
                    PUSH(b-a);
                    break;
                case '*':
                    POP(&a);
                    POP(&b);
                    PUSH(a*b);
                    break;
                case '/':
                    POP(&a);
                    POP(&b);
                    if(a==0)
                    {
                        printf("a=0了,除数不能为0;\n");
                        return -1;
                    }
                    else
                        PUSH(b/a);
                    break;
                }

            }
        POP(&a);//将结果取出

     printf("%0.2lf\n",a);



}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值