栈的应用——2. 简单计算器

2020-07-14  本文已影响0人  辘轳鹿鹿

题目描述

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

输入描述:

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

输出描述:

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

示例1

输入

1 + 2
4 + 2 * 5 - 7 / 11
0

输出

3.00
13.36

解题心得:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>




int main(){

    char str[202];
    double stack1[202];
    char stack2[202];
    while(gets(str)){
        int slen=strlen(str),i,flag=0;
        int top1=0,top2=0,sum=0;
        if(strcmp(str,"0")==0)
            break;
        str[slen]=' ';
        for(i=0;i<=slen;i++){
            if(!flag){
                if(str[i]==' '){
                    flag=1;
                    stack1[top1]=sum*1.0;
                    top1++;
                    sum=0;
                }
                else{
                    sum=sum*10;
                    sum+=str[i]-'0';

                }

            }
            else{
                if(str[i]==' '){
                    flag=0;
                }
                else{
                    if(top2==0){
                        stack2[top2]=str[i];
                        top2++;
                    }
                    else{


                        while((top2>0)&&!((stack2[top2-1]=='+'||stack2[top2-1]=='-')&&(str[i]=='*'||str[i]=='/'))){

                            top2--;
                            double tmp;
                            if(stack2[top2]=='-'){
                                tmp=stack1[top1-2]-stack1[top1-1];
                            }
                            else if(stack2[top2]=='*'){
                                tmp=stack1[top1-2]*stack1[top1-1];
                            }
                            else if(stack2[top2]=='/'){
                                tmp=stack1[top1-2]*1.0/stack1[top1-1];
                            }
                            else{
                                tmp=stack1[top1-2]+stack1[top1-1];
                            }
                            top1--;
                            stack1[top1-1]=tmp;


                        }
                        stack2[top2]=str[i];
                        top2++;

                    }
                }

            }

        }
        while(top2!=0){
                            top2--;
                            double tmp;
                            if(stack2[top2]=='-'){
                                tmp=stack1[top1-2]-stack1[top1-1];
                            }
                            else if(stack2[top2]=='*'){
                                tmp=stack1[top1-2]*stack1[top1-1];
                            }
                            else if(stack2[top2]=='/'){
                                tmp=stack1[top1-2]/stack1[top1-1];
                            }
                            else{
                                tmp=stack1[top1-2]+stack1[top1-1];
                            }
                            top1--;
                            stack1[top1-1]=tmp;
        }
    printf("%.2f\n",stack1[top1-1]);

    }

    return 0;

}


上一篇下一篇

猜你喜欢

热点阅读