栈计算逆波兰表达式
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] && '\0' != 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 }
祝我无坚不摧,祝我百毒不侵,祝我狼心狗肺,祝我逍遥快活。