zoukankan      html  css  js  c++  java
  • 栈计算逆波兰表达式

     1 #include<stack>
     2 #include<math.h>
     3 #include<iostream>
     4 #include<string.h>
     5 
     6 using namespace std;
     7 
     8 const char* s1 = "8 4 + 6 2 * -";
     9 const char* s2 = "2 3 5 + * 7 1 / + 4 -";
    10 
    11 float calculation(float i, char j, float k)
    12 {
    13     if ('!' == j)
    14     {
    15         float factorial = 1;
    16         for (int a = 1; a <= i; ++a)
    17         {
    18             factorial *= a;
    19         }
    20         return factorial;
    21     }
    22     else if ('+' == j)
    23     {
    24         return k + i;
    25     }
    26     else if ('-' == j)
    27     {
    28         return k - i;
    29     }
    30     else if ('*' == j)
    31     {
    32         return k * i;
    33     }
    34     else if ('/' == j)
    35     {
    36         return k / i;
    37     }
    38     else if ('^' == j)
    39     {
    40         return pow(k, i);
    41     }
    42 }
    43 
    44 float calculationStr(const char* S)
    45 {
    46     stack<float> numStack;
    47     for (int i = 0; i < strlen(S); ++i)
    48     {
    49         if(isalnum(S[i]))
    50         {
    51             string str = "";
    52              while(isalnum(S[i]))
    53              {    
    54                  str += S[i++];    
    55             } 
    56             --i;
    57             numStack.push(atof(str.c_str()));
    58         }
    59         else if(' ' != S[i] && '' != S[i])
    60         {
    61             if('!' == S[i])
    62             {
    63                 float num1 = numStack.top();
    64                 numStack.pop();
    65                 numStack.push(calculation(num1, S[i], 0));
    66             }
    67             else
    68             {
    69                 float num1 = numStack.top();
    70                 numStack.pop();
    71                 float num2 = numStack.top();
    72                 numStack.pop();
    73                 numStack.push(calculation(num1, S[i], num2));
    74             }
    75         }
    76     }
    77     return numStack.top();
    78 } 
    79 
    80 int main()
    81 {
    82     cout<<calculationStr(s1)<<endl;
    83     cout<<calculationStr(s2)<<endl;
    84 }
    祝我无坚不摧,祝我百毒不侵,祝我狼心狗肺,祝我逍遥快活。
  • 相关阅读:
    vi/vim 如何添加和删除多行注释
    linux报错:命令未找到
    删除远程分支的方法
    k-vim常见快捷键
    [转]常见linux命令用法介绍
    python库termcolor用法
    gitignore样例解析
    [转]"git rm" 和 "rm" 的区别
    python中的slice用法
    牛客网linux试题-错误整理-20170914
  • 原文地址:https://www.cnblogs.com/kpxy/p/14437723.html
Copyright © 2011-2022 走看看