标签:
1 #include <iostream> 2 //#include <string> 3 #include <stack> 4 #include <stdio.h> 5 #include <string.h> 6 7 using namespace std; 8 9 typedef std::stack<std::string> strStack; 10 typedef std::stack<double> valueStack; 11 12 13 inline int parseStr(const char*& str, strStack &tempStack) 14 { 15 const char* begin = str; 16 const char* p = str; 17 while (*p) 18 { 19 char buf[50]; 20 if (*p == ‘(‘ || *p == ‘+‘ || *p == ‘-‘ || *p == ‘*‘) 21 { 22 buf[0] = *p; 23 buf[1] = 0; 24 tempStack.push(buf); 25 if (p == begin) 26 ++begin; 27 } 28 else if (*p == ‘ ‘) 29 { 30 if (p == begin) 31 ++begin; 32 else 33 { 34 int size = p - begin; 35 strncpy(buf, begin, size); 36 buf[size] = 0; 37 tempStack.push(buf); 38 begin = p + 1; 39 } 40 } 41 else if (*p == ‘)‘) 42 { 43 if (p != begin) 44 { 45 int size = p - begin; 46 strncpy(buf, begin, size); 47 buf[size] = 0; 48 tempStack.push(buf); 49 begin = p + 1; 50 } 51 ++p; 52 break; 53 } 54 else 55 { 56 // 可以做一些非法字符检查, 这题貌似不需要 57 } 58 ++p; 59 } 60 str = p; 61 return 0; 62 } 63 64 65 inline int calAdd(strStack& stack, double&result) 66 { 67 if (stack.size() < 1) 68 return -1; 69 70 double r = 0; 71 while (!stack.empty()) 72 { 73 std::string str = stack.top(); 74 stack.pop(); 75 double val; 76 sscanf(str.c_str(), "%lf", &val); 77 r += val; 78 } 79 result = r; 80 return 0; 81 } 82 83 inline int calSub(strStack& stack, double&result) 84 { 85 if (stack.size() < 1 || stack.size() > 2) 86 return -1; 87 88 std::string str = stack.top(); 89 stack.pop(); 90 double val1; 91 sscanf(str.c_str(), "%lf", &val1); 92 if (stack.size() == 0) 93 { 94 result = -val1; 95 return 0; 96 } 97 98 str = stack.top(); 99 stack.pop(); 100 double val2; 101 sscanf(str.c_str(), "%lf", &val2); 102 result = val1 - val2; 103 104 return 0; 105 } 106 107 inline int calMul(strStack& stack, double& result) 108 { 109 if (stack.size() < 1) 110 return -1; 111 112 double r = 1; 113 while ( !stack.empty()) 114 { 115 std::string str = stack.top(); 116 stack.pop(); 117 double val; 118 sscanf(str.c_str(), "%lf", &val); 119 r *= val; 120 } 121 result = r; 122 return 0; 123 } 124 125 126 // 成功返回0 127 int calSubOprator(strStack& stack, double &result) 128 { 129 int r = 0; 130 double val = 0; 131 std::string operaterStr = stack.top(); 132 stack.pop(); 133 if (operaterStr == "+") 134 { 135 r = calAdd(stack, val); 136 } 137 else if (operaterStr == "-") 138 { 139 r = calSub(stack, val); 140 } 141 else if (operaterStr == "*") 142 { 143 r = calMul(stack, val); 144 } 145 else 146 return -1; 147 148 if (r == -1) 149 return -1; 150 151 result = val; 152 return 0; 153 } 154 155 inline int calcStr(strStack &tempStack, valueStack& resultStack) 156 { 157 strStack temp; 158 while (true) 159 { 160 if (tempStack.empty()) 161 return -1; 162 163 std::string str = tempStack.top(); 164 if (str == "#") 165 { 166 double val = resultStack.top(); 167 resultStack.pop(); 168 tempStack.pop(); 169 char buf[50]; 170 sprintf(buf, "%d", int(val)); 171 temp.push(buf); 172 } 173 else if (str == "(") 174 { 175 tempStack.pop(); 176 break; 177 } 178 else 179 { 180 temp.push(tempStack.top()); 181 tempStack.pop(); 182 } 183 } 184 185 double val; 186 if (calSubOprator(temp, val) == -1) 187 return -1; 188 189 resultStack.push(val); 190 return 0; 191 } 192 193 194 int calc(const char* str, double &resultVal) 195 { 196 if (str == NULL || *str == 0) 197 return -1; 198 199 const char* p = str; 200 strStack tempStr; 201 valueStack tempVal; 202 203 while (true) 204 { 205 int r = 0; 206 r = parseStr(p, tempStr); 207 if (r == -1) 208 return -1; 209 210 r = calcStr(tempStr, tempVal); 211 if (r == -1) 212 return -1; 213 214 if (*p == 0) 215 { 216 if (tempStr.empty()) 217 { 218 resultVal = tempVal.top(); 219 tempVal.pop(); 220 } 221 else 222 return -1; 223 break; 224 } 225 else 226 { 227 // 临时结果入栈 228 tempStr.push("#"); 229 } 230 } 231 232 return 0; 233 } 234 235 236 int main() 237 { 238 239 const char*arr[] = { 240 "(+ 1 (* 2 3)))", 241 "(2 3)", 242 "(- 3 2 1)", 243 "(+ (+ 1 2) (* 2 3) (- 2 1))", 244 "(- 2)" 245 }; 246 247 248 for (int i = 0; i < 5; ++i) 249 { 250 const char* buf = arr[i]; 251 double result = 0; 252 if (calc(buf, result) == 0) 253 { 254 cout << result << endl; 255 } 256 else 257 { 258 cout << "invalid expression" << endl; 259 } 260 261 } 262 263 return 0; 264 }
标签:
原文地址:http://www.cnblogs.com/dou-ya/p/4811929.html