支持运算符:+, - , *, /, %(百分号), ^(幂次方), !(阶乘)。其他符号:( ) [ ] { }"
#include#include #include #include #include using namespace std; //算术符号优先权等级 enum PRIO_LV { PRIO_LV0 = 0, PRIO_LV1 = 1, PRIO_LV2 = 2, PRIO_LV3 = 3, PRIO_LV4 = 4, }; //计算器类 class Calculator { public: Calculator(); void getFormat(); //表达式自定义标准格式化 int getPrior(char c); //获取算术符号优先级 void getPostfix(); //后缀表达式转换 void calResult(); //计算结果 void calculate(); //计算方法 double getResult(); //获取结果 string operatorSym; //运算符号 string infix; //表达式缓存 private: vector postfix; //后缀表达式向量 stack symStack; //符号栈 stack figStack; //数字栈 string stdInfix; //自定义标准格式化表达式 double result; //最终计算结果 }; Calculator::Calculator() { //构造函数,初始化成员变量 operatorSym = "支持运算符:+, - , *, /, %(百分号), ^(幂次方), !(阶乘)。其他符号:( ) [ ] { }"; result = 0.0; } //表达式自定义标准格式化 void Calculator::getFormat() { stdInfix = infix; //实现正负数 //for (int i = 0; i < stdInfix.length(); i++) { //string下标调用运算符时可能会导致类型溢出 for (size_t i = 0; i < stdInfix.size(); i++) { //string.size()返回size_type类型,避免下标运算时的类型溢出 if (stdInfix[i] == '-' || stdInfix[i] == '+') { //-x转换为0-x,+x转化为0+x if (i == 0) { stdInfix.insert(0, 1, '0'); } else if (stdInfix[i - 1] == '(') { stdInfix.insert(i, 1, '0'); } } } } //获取算术符号优先级 int Calculator::getPrior(char c) { if (c == '+' || c == '-') { return PRIO_LV1; } else if (c == '*' || c == '/') { return PRIO_LV2; } else if (c == '%' || c == '^') { return PRIO_LV3; } else if (c == '!') { return PRIO_LV4; } else { return PRIO_LV0; } //else { cout << c << 非法符号! << endl; } } //后缀表达式转换 void Calculator::getPostfix() { string tmp; //for (int i = 0; i < stdInfix.length(); i++) { for (size_t i = 0; i < stdInfix.size(); i++) { //string.size()返回size_type类型,避免下标运算时的类型溢出 tmp = "";//“”(双引号)表示一个字符串,字符串在结尾系统会默认添加一个‘ ’ //“”(双引号)占二个字节,即空格+‘ ’,‘ ’是字符串来结束标志位 对应ascii 码:00; switch (stdInfix[i]) { case '+': case '-': case '*': case '/': case '%': case '^': case '!': if (symStack.empty() || symStack.top() == '(' || symStack.top() == '[' || symStack.top() == '{') { symStack.push(stdInfix[i]); } else { while (!symStack.empty() && (getPrior(symStack.top()) >= getPrior(stdInfix[i]))) { tmp += symStack.top(); postfix.push_back(tmp); symStack.pop(); tmp = ""; } symStack.push(stdInfix[i]); } break; case '(': case '[': case '{': symStack.push(stdInfix[i]); break; case ')': while (!symStack.empty() && symStack.top() != '(') { tmp += symStack.top(); postfix.push_back(tmp); symStack.pop(); tmp = ""; } if (!symStack.empty() && symStack.top() == '(') { symStack.pop(); //将左括号出栈丢弃 } break; case ']': while (!symStack.empty() && symStack.top() != '[') { tmp += symStack.top(); postfix.push_back(tmp); symStack.pop(); tmp = ""; } if (!symStack.empty() && symStack.top() == '[') { symStack.pop(); //将左括号出栈丢弃 } break; case '}': while (!symStack.empty() && symStack.top() != '{') { tmp += symStack.top(); postfix.push_back(tmp); symStack.pop(); tmp = ""; } if (!symStack.empty() && symStack.top() == '{') { symStack.pop(); //将左括号出栈丢弃 } break; default: if ((stdInfix[i] >= '0' && stdInfix[i] <= '9')) { tmp += stdInfix[i]; while (i + 1 < stdInfix.length() && (stdInfix[i + 1] >= '0' && stdInfix[i + 1] <= '9' || stdInfix[i + 1] == '.')) { //小数处理 tmp += stdInfix[i + 1]; //是连续的数字,则追加 i++; } if (tmp[tmp.length() - 1] == '.') { tmp += '0'; //将x.做x.0处理 } postfix.push_back(tmp); } break; }//end switch }//end for //if(!symStack.empty()) { while (!symStack.empty()) { //将栈中剩余符号加入后缀表达式 tmp = ""; tmp += symStack.top(); postfix.push_back(tmp); symStack.pop(); } } //获取运算结果 void Calculator::calResult() { string tmp; double number = 0; double op1 = 0, op2 = 0; for (int i = 0; i < postfix.size(); i++) { tmp = postfix[i]; if (tmp[0] >= '0' && tmp[0] <= '9') { number = atof(tmp.c_str()); //atof把字符串转换成浮点数,c_str()获取tmp字符串的首指针 figStack.push(number); } else if (postfix[i] == "+") { if (!figStack.empty()) { op2 = figStack.top(); figStack.pop(); } if (!figStack.empty()) { op1 = figStack.top(); figStack.pop(); } figStack.push(op1 + op2); } else if (postfix[i] == "-") { if (!figStack.empty()) { op2 = figStack.top(); figStack.pop(); } if (!figStack.empty()) { op1 = figStack.top(); figStack.pop(); } figStack.push(op1 - op2); } else if (postfix[i] == "*") { if (!figStack.empty()) { op2 = figStack.top(); figStack.pop(); } if (!figStack.empty()) { op1 = figStack.top(); figStack.pop(); } figStack.push(op1 * op2); } else if (postfix[i] == "/") { if (!figStack.empty()) { op2 = figStack.top(); figStack.pop(); } if (!figStack.empty()) { op1 = figStack.top(); figStack.pop(); } figStack.push(op1 / op2); } else if (postfix[i] == "%") { if (!figStack.empty()) { op2 = figStack.top(); figStack.pop(); } if (!figStack.empty()) { op1 = figStack.top(); figStack.pop(); } figStack.push(fmod(op1, op2));//可进行小数求余 } else if (postfix[i] == "^") { if (!figStack.empty()) { op2 = figStack.top(); figStack.pop(); } if (!figStack.empty()) { op1 = figStack.top(); figStack.pop(); } figStack.push(pow(op1, op2)); } else if (postfix[i] == "!") { if (!figStack.empty()) { op1 = figStack.top(); figStack.pop(); } if (op1 > 0) { //为小数时(转化为整数求阶) double factorial = 1; for (int i = 1; i <= op1; ++i) { factorial *= i; } op1 = factorial; } figStack.push(op1); } } if (!figStack.empty()) { result = figStack.top(); } } //计算方法 void Calculator::calculate() { getFormat(); //表达式自定义标准格式化 getPostfix(); //后缀表达式转换 calResult(); //获取算术结果 } //获取结果 double Calculator::getResult() { return result; } //main函数 int main() { Calculator cal; cout << cal.operatorSym << endl; cout << "----------" << endl; while (true) { getline(cin, cal.infix); //从标准输入流中(键盘输入)读取字符串,存储到infix //结束符,默认是换行'n'。 cal.calculate(); cout << cal.getResult() << endl; } return 0; }



