zoukankan      html  css  js  c++  java
  • NYOJ-267 郁闷的C小加(二)

     

    郁闷的C小加(二)

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
     
    描述

    聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。

     
    输入
    第一行输入一个整数T,共有T组测试数据(T<10)。
    每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数并且小于1000000。
    数据保证除数不会为0。
    输出
    对于每组测试数据输出结果包括两行,先输出转换后的后缀表达式,再输出计算结果,结果保留两位小数。两组测试数据之间用一个空行隔开。
    样例输入
    2
    1+2=
    (19+21)*3-4/5=
    
    样例输出
    12+=
    3.00
    
    1921+3*45/-=
    119.20
    
    来源
    改编自NYOJ
     
      1 #include <cstdio>
      2 #include <iostream>
      3 #include <cstring>
      4 #include <stack>
      5 #include <cctype>
      6 
      7 using namespace std;
      8 
      9 char str[1005];
     10 stack<char> Optr;
     11 stack<float> Opnd;
     12 
     13 char judge(char c1, char c2)
     14 {
     15     if(c1 == '+' || c1 == '-')
     16     {
     17         if(c2 == '*' || c2 == '/' || c2 == '(')
     18             return '<';
     19         else
     20             return '>';
     21     }
     22     if(c1 == '*' || c1 == '/')
     23     {
     24         if(c2 == '(')
     25             return '<';
     26         return '>';
     27     }
     28     if(c1 == '(' && c2 == ')' || c1 == '=' && c2 == '=')
     29         return '=';
     30     return '<';
     31 }
     32 
     33 float cal(float num1, float num2, char p)
     34 {
     35     if(p == '+')
     36         return num1 + num2;
     37     else if(p == '-')
     38         return num1 - num2;
     39     else if(p == '*')
     40         return num1 * num2;
     41     else if(p == '/')
     42         return num1 / num2;
     43 }
     44 
     45 void change()
     46 {
     47     int len = strlen(str);
     48     while(!Opnd.empty())
     49         Opnd.pop();
     50     while(!Optr.empty())
     51         Optr.pop();
     52     Optr.push('=');
     53     
     54     for(int i = 0; i < len;)
     55     {
     56         if(isdigit(str[i]) || str[i] == '.')
     57         {
     58             float t1 = 0;
     59             int t2 = 1;
     60             bool flag = false;
     61             while(isdigit(str[i]) || str[i] == '.')
     62             {
     63                 if(flag)
     64                     t2 *= 10;
     65                 if(isdigit(str[i]))
     66                     t1 = t1*10+str[i]-'0';
     67                 else
     68                     flag = true;
     69                 printf("%c", str[i]);                
     70                 ++i;
     71             }
     72             Opnd.push(t1/t2);
     73         }
     74         else
     75         {
     76             char tmp = judge(Optr.top(), str[i]);
     77             if(tmp == '<')
     78             {
     79                 Optr.push(str[i]);
     80                 ++i;
     81             }
     82             else if(tmp == '>')
     83             {
     84                 tmp = Optr.top();
     85                 printf("%c", tmp);
     86                 Optr.pop();
     87                 float num1 = Opnd.top();
     88                 Opnd.pop();
     89                 float num2 = Opnd.top();
     90                 Opnd.pop();
     91                 Opnd.push(cal(num2, num1, tmp));
     92                 //++i;
     93             }
     94             else
     95             {
     96                 Optr.pop();
     97                 ++i;
     98             }
     99         }
    100     }
    101 }
    102 
    103 int main()
    104 {
    105     int T;
    106     scanf("%d", &T);
    107     while(T--)
    108     {
    109         scanf("%s", str);
    110         change();
    111         printf("=
    %.2f
    ", Opnd.top());
    112         if(T)
    113             printf("
    ");
    114     }
    115     return 0;
    116 }
  • 相关阅读:
    链接
    Oracle创建表空间
    C#中的全局异常捕捉
    软件架构入门
    Nginx安装及配置详解包括windows环境
    极路由4增强版(B70)HC5962离线ROOT通过Breed刷openwrt教程
    vue自定义全局指令v-emoji限制input输入表情和特殊字符
    【vue】@input
    【window】常用软件
    Vbox 虚拟机全屏
  • 原文地址:https://www.cnblogs.com/dongsheng/p/3163669.html
Copyright © 2011-2022 走看看