• 后缀表达式加表达式求值


     

    郁闷的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
    
     
      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<stack>
      4 #include<stdlib.h>
      5 using namespace std;
      6 
      7 char a[1010];
      8 char b[1010];
      9 stack <char> s1;
     10 stack <float> s2;
     11 
     12 int i,j,n,m,t;
     13 float x,y,z;
     14 
     15 int fun(char x)
     16 {
     17     switch(x)
     18     {
     19         case '+' :
     20         case '-' :return 1;
     21         case '*' :
     22         case '/' :return 2;
     23         case '(' :return 0;
     24         default  :return -1;
     25     }
     26 }
     27 
     28 float js(float x,float y,char z)
     29 {
     30     switch(z)
     31     {
     32         case '+':return y+x;
     33         case '-':return y-x;
     34         case '*':return y*x;
     35         default :return y/x;
     36     }
     37 }
     38 
     39 int main()
     40 {
     41     int p;
     42     char c[1010];
     43     float d;
     44     scanf("%d",&t);
     45     s1.push('#');
     46     while(t--)
     47     {
     48         j=0;
     49         scanf("%s",a);
     50         m=strlen(a)-1;
     51         for(i=0;i<m;i++)
     52         {
     53             if(a[i]>='0'&&a[i]<='9'||a[i]=='.')
     54             {
     55                 memset(c,0,sizeof(c));
     56                 p=0;
     57                 while(a[i]>='0'&&a[i]<='9'||a[i]=='.')
     58                 {
     59                     b[j++]=a[i];
     60                     c[p++]=a[i++];
     61                 }
     62                 d=atof(c);
     63                 s2.push(d);
     64                 i--;
     65             }
     66 
     67             else if(a[i]=='(')  s1.push(a[i]);
     68 
     69             else if(a[i]==')')
     70             {
     71                 while(s1.top()!='(')
     72                 {
     73                     b[j++]=s1.top();
     74                     x=s2.top();s2.pop();
     75                     y=s2.top();s2.pop();
     76                     x=js(x,y,b[j-1]);
     77                     s2.push(x);
     78                     s1.pop();
     79                 }
     80                 s1.pop();
     81             }
     82 
     83             else 
     84             {
     85                 while(fun(s1.top())>=fun(a[i]))
     86                 {
     87                     b[j++]=s1.top();
     88                     x=s2.top();s2.pop();
     89                     y=s2.top();s2.pop();
     90                     x=js(x,y,b[j-1]);
     91                     s2.push(x);
     92                     s1.pop();
     93                 }
     94                 s1.push(a[i]);
     95             }
     96         }
     97 
     98         while(s1.top()!='#')
     99         {
    100             b[j++]=s1.top();
    101             x=s2.top();s2.pop();
    102             y=s2.top();s2.pop();
    103             x=js(x,y,b[j-1]);
    104             s2.push(x);
    105             s1.pop();
    106         }
    107         b[j]='=';
    108         b[j+1]='\0';
    109         puts(b);
    110         printf("%.2f\n",s2.top());
    111         s2.pop();
    112     }
    113     return 0;
    114 }
  • 相关阅读:
    B-树和B+树
    线程与内核对象的同步-2
    线程与内核对象的同步
    高级线程同步 临界区
    Levenshtein Distance (编辑距离) 算法详解
    平衡二叉树
    静态查找表
    C++中的容器类详解
    How do I list all tables/indices contained in an SQLite database
    SmartGit STUDY 2
  • 原文地址:https://www.cnblogs.com/xiaofanke/p/3106860.html
Copyright © 2020-2023  润新知