添加项目文件。
This commit is contained in:
97
ScientificCalculator/PostfixEval.cpp
Normal file
97
ScientificCalculator/PostfixEval.cpp
Normal file
@@ -0,0 +1,97 @@
|
||||
#include"PostfixEval.h"
|
||||
#include<algorithm>
|
||||
#include<cctype>
|
||||
|
||||
double PostfixEval::run(const std::vector<Token>& postfix, const unordered_map<string, double>& vars) {
|
||||
stack<double> stk;
|
||||
|
||||
for (const auto& token : postfix) {
|
||||
if (token.is_num())
|
||||
//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble<6C><65>ջ
|
||||
stk.push(stod(token.value));
|
||||
else if (token.is_var()) {
|
||||
//<2F><><EFBFBD>ұ<EFBFBD><D2B1><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>
|
||||
auto it = vars.find(token.value);
|
||||
// ֧<><D6A7><EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD> PAI <20><> e
|
||||
|
||||
if (it == vars.end()) {
|
||||
if (token.value == "PAI")
|
||||
stk.push(2.0 * std::asin(1.0)); // <20><> = 2 * arcsin(1)
|
||||
else if (token.value == "e")
|
||||
stk.push(std::exp(1.0)); // e = exp(1)
|
||||
else
|
||||
throw runtime_error("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD>壺" + token.value);
|
||||
}
|
||||
else stk.push(it->second);
|
||||
}
|
||||
else if (token.is_ope()) {
|
||||
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>ж<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
|
||||
if (stk.size() < 2) throw runtime_error("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||||
double b = stk.top();
|
||||
stk.pop();
|
||||
double a = stk.top();
|
||||
stk.pop();
|
||||
double res = apply_BO(token.value, a, b);
|
||||
stk.push(res);
|
||||
}
|
||||
else if (token.is_fun()) {
|
||||
//ȡ<><C8A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>һԪ<D2BB><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥ<EFBFBD><C8BA><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
||||
if (stk.empty()) throw runtime_error("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||||
double x = stk.top();
|
||||
stk.pop();
|
||||
double res = apply_UF(token.value, x);
|
||||
stk.push(res);
|
||||
}
|
||||
else
|
||||
throw runtime_error("δ֪Token<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||||
}
|
||||
|
||||
if (stk.size() != 1)
|
||||
throw runtime_error("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>Ψһ");
|
||||
|
||||
return stk.top();
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD>ж<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
double PostfixEval::apply_BO(const string& op, double a, double b) {
|
||||
if (op == "+") return a + b;
|
||||
if (op == "-") return a - b;
|
||||
if (op == "*") return a * b;
|
||||
if (op == "/") {
|
||||
if (b == 0) throw runtime_error("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0");
|
||||
return a / b;
|
||||
}
|
||||
if (op == "^") return pow(a, b);
|
||||
if (op == "%") {
|
||||
if (b == 0) throw runtime_error("ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>");
|
||||
return std::fmod(a, b);
|
||||
}
|
||||
throw runtime_error("δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" + op);
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>һԪ<D2BB><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥ<EFBFBD><C8BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
double PostfixEval::apply_UF(const string& func, double x) {
|
||||
string f = func;
|
||||
transform(f.begin(), f.end(), f.begin(), ::tolower);
|
||||
|
||||
if (f == "sin") return sin(x);
|
||||
if (f == "cos") return cos(x);
|
||||
if (f == "tan") return tan(x);
|
||||
if (f == "sqrt") {
|
||||
if (x < 0)
|
||||
throw runtime_error("sqrt<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>");
|
||||
return sqrt(x);
|
||||
}
|
||||
if (f == "log") {
|
||||
if (x <= 0)
|
||||
throw runtime_error("log<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0");
|
||||
return log(x);
|
||||
}
|
||||
if (f == "exp") return exp(x);
|
||||
if (f == "abs") return fabs(x);
|
||||
if (f == "asin") return asin(x);
|
||||
if (f == "acos") return acos(x);
|
||||
if (f == "atan") return atan(x);
|
||||
|
||||
throw runtime_error("δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" + func);
|
||||
}
|
||||
Reference in New Issue
Block a user