四则运算

来源:互联网 发布:cf雷神刷枪软件 编辑:程序博客网 时间:2024/04/29 15:03
/*功能:四则运算输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}"返回:算术表达式的计算结果约束:pucExpression字符串中的有效字符包括[‘0’ - ‘9’], ‘ + ’, ‘ - ’, ‘*’, ‘ / ’, ‘(’, ‘)’, ‘[’, ‘]’, ‘{ ’, ‘ }’pucExpression算术表达式的有效性由调用者保证;*/#include <iostream>#include <string>#include <cctype>#include <map>#include <stack>using namespace std;int StrToNum(string number){int result = 0;int n = number.length();for (int i = 0; i < n; ++i) result = result * 10 + number[i] - '0';return result;}int calculate(string &Expression){int n = Expression.length();for (int i = 0; i < n; ++i){if (Expression[i] == '-' && (i == 0 || Expression[i - 1] == '(' || Expression[i - 1] == '[' || Expression[i - 1] == '{')){Expression.insert(i, 1, '0');++n;}}map<char, int> symbol;symbol['+'] = 1;symbol['-'] = 1;symbol['*'] = 2;symbol['/'] = 2;symbol['('] = 0;symbol['['] = 0;symbol['{'] = 0;symbol[')'] = -1;symbol[']'] = -1;symbol['}'] = -1;stack<char> SymStack;string inExpression;for (int i = 0; i < n; ++i){if (isdigit(Expression[i])){while (isdigit(Expression[i])){inExpression.push_back(Expression[i]);++i;}inExpression.push_back(' ');--i;}else{if (symbol[Expression[i]] > 0){if (SymStack.empty() || symbol[Expression[i]] > symbol[SymStack.top()])SymStack.push(Expression[i]);else{while (!SymStack.empty() && symbol[SymStack.top()] >= symbol[Expression[i]]){inExpression.push_back(SymStack.top());SymStack.pop();}SymStack.push(Expression[i]);}}else if (symbol[Expression[i]] == 0){SymStack.push(Expression[i]);}else{while (symbol[SymStack.top()]){inExpression.push_back(SymStack.top());SymStack.pop();}SymStack.pop();}}}while (!SymStack.empty()){inExpression.push_back(SymStack.top());SymStack.pop();}//cout << "inExpression: " << inExpression << endl;stack<int> result;n = inExpression.length();for (int i = 0; i < n; ++i){if (isdigit(inExpression[i])){string num;while (inExpression[i] != ' '){num.push_back(inExpression[i]);++i;}result.push(StrToNum(num));}else{int num2 = result.top();result.pop();int num1 = result.top();result.pop();if (inExpression[i] == '+')result.push(num1 + num2);else if (inExpression[i] == '-') result.push(num1 - num2);else if (inExpression[i] == '*') result.push(num1 * num2);else{if (num2 == 0) return 0;result.push(num1 / num2);}}}return result.top();}int main(){string Expression;while (cin >> Expression) cout << calculate(Expression) << endl;return 0;}


/*给定一个字符串描述的算术表达式,计算出结果值。输入字符串长度不超过100,合法的字符包括”+, -, *, /, (, )”,”0-9”,字符串内容的合法性及表达式语法的合法性由做题者检查。本题目只涉及整型计算。功能: 对输入的字符串表达式进行求值计算,并输出结果。输入:String inputString:表达式字符串返回: int :正常返回true,失败返回false*/#include <iostream>#include <string>#include <cctype>#include <map>#include <stack>#include <algorithm>using namespace std;int StrToNum(string number){int result = 0;int n = number.length();for (int i = 0; i < n; ++i) result = result * 10 + number[i] - '0';return result;}int calculate(string &Expression, stack<int> &result){if (count(Expression.begin(), Expression.end(), '(') != count(Expression.begin(), Expression.end(), ')')) return -1;int n = Expression.length();for (int i = 0; i < n; ++i){if (Expression[i] == '-' && (i == 0 || Expression[i - 1] == '(' || Expression[i - 1] == '[' || Expression[i - 1] == '{')){Expression.insert(i, 1, '0');++n;}}map<char, int> symbol;symbol['+'] = 1;symbol['-'] = 1;symbol['*'] = 2;symbol['/'] = 2;symbol['('] = 0;symbol[')'] = -1;stack<char> SymStack;string inExpression;for (int i = 0; i < n; ++i){if (isdigit(Expression[i])){while (isdigit(Expression[i])){inExpression.push_back(Expression[i]);++i;}inExpression.push_back(' ');--i;}else{if (symbol[Expression[i]] > 0){if (SymStack.empty() || symbol[Expression[i]] > symbol[SymStack.top()])SymStack.push(Expression[i]);else{while (!SymStack.empty() && symbol[SymStack.top()] >= symbol[Expression[i]]){inExpression.push_back(SymStack.top());SymStack.pop();}SymStack.push(Expression[i]);}}else if (symbol[Expression[i]] == 0){SymStack.push(Expression[i]);}else{while (!SymStack.empty() && symbol[SymStack.top()]){inExpression.push_back(SymStack.top());SymStack.pop();}if (SymStack.empty()) return -1;SymStack.pop();}}}while (!SymStack.empty()){inExpression.push_back(SymStack.top());SymStack.pop();}//cout << "inExpression: " << inExpression << endl;n = inExpression.length();for (int i = 0; i < n; ++i){if (isdigit(inExpression[i])){string num;while (inExpression[i] != ' '){num.push_back(inExpression[i]);++i;}result.push(StrToNum(num));}else{if (result.empty()) return -1;int num2 = result.top();result.pop();if (result.empty()) return -1;int num1 = result.top();result.pop();if (inExpression[i] == '+')result.push(num1 + num2);else if (inExpression[i] == '-') result.push(num1 - num2);else if (inExpression[i] == '*') result.push(num1 * num2);else{if (num2 == 0) return -1;result.push(num1 / num2);}}}if (result.size() == 1)return 0;else return -1;}int main(){string Expression;while (cin >> Expression){stack<int> result;int r = calculate(Expression, result);if (r == -1) cout << "false" << endl;else cout << result.top() << endl << "true" << endl;}return 0;}


0 0
原创粉丝点击