/*
功能:四则运算
输入: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;
}