zoukankan      html  css  js  c++  java
  • 7-21 求前缀表达式的值 (25分)

    参考:https://blog.csdn.net/qq_36254699/article/details/78824351

    前缀表达式求值方法:

    先将表达式入栈a,将栈a元素逐个出栈,如果是数字,直接入栈b,如果是操作符x,则b出栈2次,用t1接收第一个数,t2接收第二个数,再将t2 x t1的计算

    结果压入栈b。

    最后留在栈b的结果就是计算的结果。

      1 #include <iostream>
      2 #include <string>
      3 #include <cstring>
      4 #include <cmath>
      5 #include <iomanip>
      6 using namespace std;
      7 class stk
      8 {
      9 public:
     10     stk() :r(-1) {}
     11     ~stk() {}
     12     void push(double k)
     13     {
     14         s[++r] = k;
     15     }
     16     double top()
     17     {
     18         if (r != -1)
     19             return s[r--];
     20     }
     21 public:
     22     double s[100];
     23     int r;
     24 };
     25 int main()
     26 {
     27     stk digit;
     28     char exp[110];
     29     cin.getline(exp, 100);
     30     int Max;
     31     for (Max = 0; exp[Max] != ''; Max++);
     32     for (int i = Max - 1; i >= 0; i--)
     33     {
     34         double sum = 0;
     35 
     36         if (exp[i] >= '0' && exp[i] <= '9')
     37         {
     38             double mult = 1;
     39             for (int j = i; j >= 0; j--)
     40             {
     41                 if (exp[j] == ' ')
     42                 {
     43                     digit.push(sum);
     44                     i = j;
     45                     break;
     46                 }
     47                 else
     48                 {
     49                     if ((exp[j] >= '0' && exp[j] <= '9') || exp[j] == '.')
     50                     {
     51                         if (exp[j] >= '0' && exp[j] <= '9')
     52                         {
     53                             sum += (exp[j] - '0') * mult;
     54                             mult *= 10;
     55                             if (j == 0)
     56                             {
     57                                 digit.push(sum);
     58                                 i = j;
     59                                 break;
     60                             }
     61                         }
     62                         else
     63                         {
     64                             sum = sum / mult;
     65                             mult = 1;
     66                         }
     67                     }
     68                     else if ((exp[j] == '+' || exp[j] == '-') && j == 0)
     69                     {
     70                         if (exp[j] == '-')sum = -sum;
     71                         digit.push(sum);
     72                         i = j;
     73                         break;
     74                     }
     75                     else if (exp[j] == '-')
     76                     {
     77                         sum = -sum;
     78                     }
     79                     else continue;
     80 
     81                 }
     82             }
     83         }
     84         else
     85         {
     86             if (exp[i] == ' ')
     87             {
     88                 continue;
     89             }
     90             else
     91             {
     92                 double t1, t2;
     93                 t1 = digit.top();
     94                 t2 = digit.top();
     95                 if (exp[i] == '+')
     96                 {
     97                     sum = t1 + t2;
     98                 }
     99                 else if (exp[i] == '-')
    100                 {
    101                     sum = t1 - t2;
    102                 }
    103                 else if (exp[i] == '*')
    104                 {
    105                     sum = t1 * t2;
    106                 }
    107                 else if (exp[i] == '/')
    108                 {
    109                     if (t2 != 0)
    110                     {
    111                         sum = t1 / t2;
    112                     }
    113                     else
    114                     {
    115                         cout << "ERROR";
    116                         exit(0);
    117                     }
    118                 }
    119                 digit.push(sum);
    120             }
    121         }
    122     }
    123     cout << fixed << setprecision(1) << digit.top() << endl;
    124     return 0;
    125 }
  • 相关阅读:
    2016中国大学生程序设计竞赛
    POJ 2239 化二分图右集合二维为一位的最大匹配
    POJ 1274 二分图最大匹配简单单向
    二分图最大匹配模板
    找割点和割边
    HDU 4432 求因子+进制转换
    HDU 4438 概率 多个情况下的数学期望
    HDU 4424 并查集+贪心思想
    POJ 1611 记录节点数的并查集
    HDU 4430 二分查找
  • 原文地址:https://www.cnblogs.com/2020R/p/12423293.html
Copyright © 2011-2022 走看看