zoukankan      html  css  js  c++  java
  • 【zzuli-1923】表达式求值

    题目描述

    假设表达式定义为:
    1. 一个十进制的正整数 X 是一个表达式。
    2. 如果 X 和 Y 是 表达式,则 X+Y, X*Y 也是表达式; *优先级高于+.
    3. 如果 X 和 Y 是 表达式,则 函数 Smax(X,Y)也是表达式,其值为:先分别求出 X ,Y 
    值的各位数字之和,再从中选最大数。
    4.如果 X 是 表达式,则 (X)也是表达式。
    例如: 
    表达式 12*(2+3)+Smax(333,220+280) 的值为 69。
    请你编程,对给定的表达式,输出其值。

    输入

    第一行: T 表示要计算的表达式个数 ($1 le T le 10$)
    接下来有 T 行, 每行是一个字符串,表示待求的表达式,长度<=1000

    输出

    对于每个表达式,输出一行,表示对应表达式的值。

    样例输入

    3
    12+2*3
    12*(2+3)
    12*(2+3)+Smax(333,220+280) 
    

    样例输出

    18
    60
    69

    1.将中缀表达式转化成后缀表达式。如果是整数直接输出,如果是运算符且比栈顶元素优先极高就压入栈顶,否则弹出栈顶运算符。其中左括号优先级最低,但是遇到无条件压栈,遇到右括号就将栈内的运算符弹出,直到遇到左括号,左右括号不输出;新定义运算规则Smax可以看做运算符为','。

    2.将后缀表达式求值。将后缀表达式入栈,遇到运算符则弹出栈顶两个数进行运算,遇到新定义运算','特殊考虑一下即可。

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 string s;
      4 string houzhui[1004];
      5 map<char, int>M;
      6 int ret_num(string s)
      7 {
      8     int l = s.size(), sum = 0;
      9     for(int i = 0; i < l; i++)
     10     {
     11         if(s[i] >= '0' && s[i] <= '9')
     12             sum = sum*10+s[i]-'0';
     13         else return -1;
     14     }
     15     return sum;
     16 }
     17 int Bit(int n)
     18 {
     19     int sum = 0;
     20     while(n)
     21     {
     22         sum += n%10;
     23         n /= 10;
     24     }
     25     return sum;
     26 }
     27 int main()
     28 {
     29     int n;
     30     stringstream ss;
     31     string s1;
     32     cin>>n;
     33     M['('] = 0, M[','] = 1, M['+'] = 2, M['*'] = 3;
     34     while(n--)
     35     {
     36         cin>>s;
     37         stack<char>S;
     38         int l = s.size(), c = 0, num = 0;
     39         for(int i = 0; i < l; i++)
     40         {
     41             if(s[i] == 'S' || s[i] == 'm' || s[i] == 'a' || s[i] == 'x') continue;
     42             if(s[i] >= '0' && s[i] <= '9') num = num*10+s[i]-'0';
     43             else
     44             {
     45                 if(num != 0)//两运算符相邻的情况
     46                 {
     47                     ss.clear();
     48                     ss<<num, ss>>s1;
     49                     houzhui[c++] = s1;
     50                     num = 0;
     51                 }
     52  
     53                 if(s[i] == '(') S.push(s[i]);
     54                 else if(s[i] == ')')
     55                 {
     56                     while(S.top() != '(')
     57                     {
     58                         houzhui[c++] = S.top();
     59                         S.pop();
     60                     }
     61                     S.pop();
     62                 }
     63                 else
     64                 {
     65                     while(!S.empty() && M[S.top()] >= M[s[i]])
     66                     {
     67                         houzhui[c++] = S.top();
     68                         S.pop();
     69                     }
     70                     S.push(s[i]);
     71                 }
     72             }
     73         }
     74         ss.clear();
     75         if(num != 0)
     76         {
     77             ss<<num, ss>>s1;
     78             houzhui[c++] = s1;
     79         }
     80         while(!S.empty())
     81         {
     82             houzhui[c++] = S.top();
     83             S.pop();
     84         }
     85         stack<int>S1;
     86         for(int i = 0; i < c; i++)
     87         {
     88             num = ret_num(houzhui[i]);//判断是否是整数若是返回其值,不是返回-1(数不可能为负)
     89             if(num != -1) S1.push(num);
     90             else
     91             {
     92                 int n2 = S1.top();
     93                 S1.pop();
     94                 int n1 = S1.top();
     95                 S1.pop();
     96                 if(houzhui[i] == "+") S1.push(n1+n2);
     97                 else if(houzhui[i] == "*") S1.push(n1*n2);
     98                 else
     99                 {
    100                     int bit1 = Bit(n1);
    101                     int bit2 = Bit(n2);
    102                     S1.push(max(bit1, bit2));
    103                 }
    104             }
    105         }
    106         printf("%d
    ", S1.top());
    107     }
    108     return 0;
    109 }
  • 相关阅读:
    Visual Studio 中的Code Snippet(代码片段)功能介绍
    对 FID 的解释
    感性负载和二极管保护
    二极管信号检波器
    java如何自动设置数据库自增长编号
    JDK1.8遍历方式
    转载:windows查看进程端口号
    发布订阅:分发代理无法在C:Program FilesMicrosoft SQL Server120COM 目录中创建临时文件
    confluence搭建wiki
    Hadoop集群安装(centos7.5+ambari-2.7.4.0部署安装)
  • 原文地址:https://www.cnblogs.com/lesroad/p/8980099.html
Copyright © 2011-2022 走看看