zoukankan      html  css  js  c++  java
  • nyist0j 35 表达式求值

    题目链接:表达式求值

    该题以前做过但是WA了,今天终于把他解决了,各种悲剧啊,又是考虑不周到啊。。。。。。。。。。。。。。。。。。。

    所以贴出来纪念一下,并作为一个警示

    /****
    ps:注意当遇到 )时处理到遇到(之前
    当一个符号进栈,判断之前的符号是否可以出栈,知道没有可出栈的
    */
    
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    
    using namespace std;
    
    bool judge_fuhao(char ch,char ch1)//ch1为将进栈
    {
        //printf("fuhao---->%c  %c
    ",ch,ch1);
        if(ch == '(' )
            return true;
        else if(ch1 == '+' ||ch1 == '-')
        {
            return false;
        }
        else if(ch1 == '*' || ch1 == '/')
        {
            if(ch == '+' || ch == '-' )
                return true;
            else
            return false;
        }
    }
    
    double judge_mtah(char ch,double y,double x)//运算
    {
        //printf("%c %lf %lf
    ",ch,x,y);
        switch(ch)
        {
            case '+':
                    return x + y; break;
            case '-':
                    return x - y; break;
            case '/':
                    return 1.0*x / y; break;
            case '*':
                    return x * y; break;
        }
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        char ch[1003];
        char stack_ch[1003];
        double stack_a[1003];
        int stack_a_t = 0;
        int stack_ch_t = 0;
    
        while(T--)
        {
            //freopen("2.txt","w",stdout);
            scanf("%s",ch);
            stack_a_t = 0;
            stack_ch_t = 0;
            int len = strlen(ch);
            char ans[1005];
            int ans_t = 0;
            double tmp = 0;
            int i;
            double x,y,z;
            for(i = 0; i < len; i++)
            {
                if(ch[i] == '+'|| ch[i]=='-'||ch[i]=='*'||ch[i]=='/'||ch[i]=='('||ch[i]=='=')
                   {
                       if(ans_t != 0)
                        {
                            tmp = atof(ans);
                            ans_t = 0;
                            ans[ans_t] = '';
                            stack_a[stack_a_t++] = tmp;
                        }
                         if(ch[i] != '=')
                          {
                        if(stack_ch_t == 0 || ch[i] == '(')
                                {
                                    stack_ch[stack_ch_t++] = ch[i];
                                }
                        else
                          while(1)//+-*/进来
                            {
                                if(stack_ch_t-1 < 0 || judge_fuhao(stack_ch[stack_ch_t-1],ch[i])== true)
                                    {
                                        stack_ch[stack_ch_t++] = ch[i];
                                        break;
                                    }
                                else
                                {
                                    x = stack_a[stack_a_t-1];
                                    stack_a_t--;
                                    y = stack_a[stack_a_t-1];
                                    stack_a_t--;
                                    z = judge_mtah(stack_ch[stack_ch_t-1],x,y);
                                    stack_ch_t--;
                                    stack_a[stack_a_t++] = z;
                                }
                            }
                          }
                          else if(ch[i] == '='){
                          {
                              if(stack_ch_t > 1 && judge_fuhao(stack_ch[stack_ch_t-2],stack_ch[stack_ch_t-1]) == true )
                              {
                                  x = stack_a[stack_a_t-1];
                                  stack_a_t--;
                                  y = stack_a[stack_a_t-1];
                                  stack_a_t--;
                                  z = judge_mtah(stack_ch[stack_ch_t-1],x,y);
                                  stack_ch_t--;
                                  stack_a[stack_a_t++] = z;
    
                              }
                          }
                          }
                   }
                else if(ch[i] == ')')
                    {
                        if(ans_t != 0)
                        {
                            tmp = atof(ans);
                            ans_t = 0;
                            ans[ans_t] = '';
                            stack_a[stack_a_t++] = tmp;
                        }
    
                        while(1)
                        {
                            if(stack_ch[stack_ch_t-1] == '(')
                               {
                                   stack_ch_t--;
                                   break;
                               }
                            else
                            {
                                x = stack_a[stack_a_t-1];
                                stack_a_t--;
                                y = stack_a[stack_a_t-1];
                                stack_a_t--;
                                z = judge_mtah(stack_ch[stack_ch_t-1],x,y);
                                stack_a[stack_a_t++] = z;
                                stack_ch_t--;
                            }
                        }
                    }
                else
                {
                    ans[ans_t++] = ch[i];
                    ans[ans_t] = '';
                }
            }
            for(i = stack_ch_t-1; i >= 0; i--)
            {
                x = stack_a[stack_a_t-1];
                stack_a_t--;
                y = stack_a[stack_a_t-1];
                stack_a_t--;
                z = judge_mtah(stack_ch[i],x,y);
                stack_a[stack_a_t++] = z;
            }
            printf("%0.2lf
    ",stack_a[0]);
        }
        return 0;
    }
    
  • 相关阅读:
    Erlang 杂记 IV
    ASP.NET MVC的View是如何被呈现出来的?[设计篇]
    面向对象—在线文件管理模块
    软件开发中个人在团队里的效绩评定
    用go语言遍历文件夹
    磁盘缓存的算法:写算法
    一种Lua到C的封装
    从信息系统界面设计引发的思考
    基于Backbone.js的JavaScript MVC示例程序
    C和C++
  • 原文地址:https://www.cnblogs.com/yyroom/p/3210040.html
Copyright © 2011-2022 走看看