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

     

    表达式求值

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:4
     
      描述
    ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
    比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
     
    输入
    第一行输入一个整数n,共有n组测试数据(n<10)。
    每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
    数据保证除数不会为0
    输出
    每组都输出该组运算式的运算结果,输出结果保留两位小数。
    样例输入
    2
    1.000+2/4=
    ((1+2)*5+1)/4=
    样例输出
    1.50
    4.00

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 #include<stack>
     5 using namespace std;
     6 
     7 char a[1010];
     8 stack<char>s1;
     9 stack<float>s2;
    10 
    11 int fun(char x)
    12 {
    13     switch(x)
    14     {
    15         case '+':
    16         case '-':return 1;
    17         case '*':
    18         case '/':return 2;
    19         case '(':return 0;
    20         default :return -1;
    21     }
    22 }
    23 
    24 float js(float x,float y,char z)
    25 {
    26     switch(z)
    27         {
    28             case '+':return y+x;
    29             case '-':return y-x;
    30             case '*':return y*x;
    31             default :return y/x;
    32         }
    33 }
    34 
    35 int main()
    36 {
    37     int i,n,m,t;
    38     float x,y,z;
    39     s1.push('#');
    40     scanf("%d",&t);
    41     while(t--)
    42     {
    43         scanf("%s",a);
    44         m=strlen(a)-1;
    45         for(i=0;i<m;i++)
    46         {
    47             if(a[i]>='0'&&a[i]<='9'||a[i]=='.')
    48             {
    49                 sscanf(a+i,"%f%n",&x,&n);
    50                 s2.push(x);
    51                 i+=n-1;
    52             }
    53             
    54             else if(a[i]=='(') s1.push(a[i]);
    55 
    56             else if(a[i]==')')
    57             {
    58                 while(s1.top()!='(')
    59                 {
    60                     z=s1.top();
    61                     x=s2.top();s2.pop();
    62                     y=s2.top();s2.pop();
    63                     x=js(x,y,z);
    64                     s2.push(x);
    65                     s1.pop();
    66                 }
    67                 s1.pop();
    68             }
    69             else 
    70             {
    71                 while(fun(s1.top())>=fun(a[i]))
    72                 {
    73                     z=s1.top();
    74                     x=s2.top();s2.pop();
    75                     y=s2.top();s2.pop();
    76                     x=js(x,y,z);
    77                     s2.push(x);
    78                     s1.pop();
    79                 }
    80                 s1.push(a[i]);
    81             }
    82         }
    83 
    84         while(s1.top()!='#')
    85         {
    86             z=s1.top();
    87             x=s2.top();s2.pop();
    88             y=s2.top();s2.pop();
    89             x=js(x,y,z);
    90             s2.push(x);
    91             s1.pop();
    92         }
    93         printf("%.2f\n",s2.top());
    94         s2.pop();
    95     }
    96     return 0;
    97 }
  • 相关阅读:
    计算机网络【七】:可靠传输的实现 (tcp窗口滑动以及拥塞控制)【转】
    计算机网络【六】:传输层-TCP概述 【转】
    计算机网络【五】:路由选择协议 【转】
    计算机网络【三】:数据链路层 【转】
    计算机网络【二】:物理层【转】
    计算机网络【一】:概述 【转】
    装饰模式-Decorator
    Java中的文件上传和下载
    模板方法模式-TemplateMethod
    策略模式-Strategy
  • 原文地址:https://www.cnblogs.com/xiaofanke/p/3106960.html
Copyright © 2011-2022 走看看