Codeup新家 (hustoj.com)http://codeup.hustoj.com/contest.php?cid=100000602
书里给的是先转换成后缀表达式再计算的思路,我嫌麻烦就没有做这个处理
#include #include #include #include #include #include using namespace std; void initMap(map &mp) { mp['+'] = 0; mp['-'] = 0; mp['*'] = 1; mp['/'] = 1; } void pushSym(char c, stack& sym, stack& numbers, map& mp) { char sy; double a, b, f; while (sym.empty() == false && mp[c] <= mp[sym.top()]) { sy = sym.top(); sym.pop(); b = numbers.top(); numbers.pop(); a = numbers.top(); numbers.pop(); if (sy == '+')f = a + b; else if (sy == '-')f = a - b; else if (sy == '*')f = a * b; else if (sy == '/')f = a / b; numbers.push(f); } sym.push(c); } double calcu(stack& numbers, stack& sym) { char sy; double a, b, f=numbers.top(); while (sym.empty() == false) { sy = sym.top(); sym.pop(); b = numbers.top(); numbers.pop(); a = numbers.top(); numbers.pop(); if (sy == '+')f = a + b; else if (sy == '-')f = a - b; else if (sy == '*')f = a * b; else if (sy == '/')f = a / b; numbers.push(f); } numbers.pop(); return f; } int main() { stack numbers; stack sym; map mp; initMap(mp); while (1) { double num;///如果是int就处理不了较大数据,虽然double也可能失真,但是还是AC了 string str; getline(cin, str); if (str == "0")break; else { while (str.size()!=0) { string s; if (str.find(' ') != string::npos) { s= str.substr(0, str.find(' ')); str.erase(0, str.find(' ')+1); } else { s = str; str.clear(); } num = stof(s);string转double numbers.push(num); if (str.size()==0)break; string sy; sy = str[0]; str.erase(0, str.find(' ')+1); char c = *(sy.c_str()); pushSym(c, sym, numbers, mp); } double result; result = calcu(numbers, sym); printf("%.2lfn", result); } } }
上一篇 QML中调用c++代码
下一篇 C++设计模式之策略模式
版权所有 (c)2021-2022 MSHXW.COM
ICP备案号:晋ICP备2021003244-6号