Pagini recente » Cod sursa (job #2552913) | Cod sursa (job #91968) | Cod sursa (job #1017473) | Cod sursa (job #1115266) | Cod sursa (job #1234823)
#include <fstream>
#include <stack>
#include <cctype>
#include <string>
// #include <iostream>
enum State{Op, Number};
long long CompMult(std::stack<long long>&nums, std::stack<char>& ops)
{
char op = ops.top();
ops.pop();
long long a, b = nums.top();
nums.pop();
if (!ops.empty() && (ops.top() == '*' || ops.top() == '/'))
a = CompMult(nums, ops);
else{
a = nums.top();
nums.pop();
}
long long c;
if (op == '*')
c = a * b;
else
c = a / b;
// std::cout << a << " " << op << " " << b << " " << c << "\n";
return c;
}
long long CompSum(std::stack<long long>&nums, std::stack<char>& ops)
{
char op = ops.top();
ops.pop();
long long a, b = nums.top();
nums.pop();
if (!ops.empty() && (ops.top() == '+' || ops.top() == '-'))
a = CompSum(nums, ops);
else{
a = nums.top();
nums.pop();
}
long long c;
if (op == '+')
c = a + b;
else
c = a - b;
// std::cout << a << " " << op << " " << b << "\n";
return c;
}
long long Compute(const char* expr)
{
std::stack<long long> nums;
std::stack<char> ops;
State s = Number;
while (*expr) {
if (*expr == ')') {
if (!ops.empty() && (ops.top() == '*' || ops.top() == '/')){
long long num = CompMult(nums, ops);
nums.push(num);
}
if (!ops.empty() && (ops.top() == '+' || ops.top() == '-')){
long long num = CompSum(nums, ops);
nums.push(num);
}
// std::cout << nums.top() << "\n";
ops.pop();
if (!ops.empty() && (ops.top() == '*' || ops.top() == '/')){
long long num = CompMult(nums, ops);
nums.push(num);
}
s = Op;
++expr;
// std::cout << ")\n";
}
else if (s == Number) {
if (*expr == '(') {
// std::cout << "(\n";
ops.push(*expr);
++expr;
}
else if (*expr != ')'){
long long num = 0;
if (std::isdigit(*expr)){
while (std::isdigit(*expr)) {
num = (num * 10) + (*expr) - '0';
expr++;
}
nums.push(num);
}
if (!ops.empty() && (ops.top() == '*' || ops.top() == '/')) {
num = CompMult(nums, ops);
nums.push(num);
}
s = Op;
}
}
else {
ops.push(*expr);
++expr;
s = Number;
}
}
if (!ops.empty() && (ops.top() == '*' || ops.top() == '/')) {
long long c = CompMult(nums, ops);
nums.push(c);
}
if (!ops.empty() && (ops.top() == '+' || ops.top() == '-')) {
long long c = CompSum(nums, ops);
nums.push(c);
}
long long rez = nums.top();
return rez;
}
int main()
{
std::ifstream f("evaluare.in");
std::ofstream g("evaluare.out");
std::string s;
f >> s;
g << Compute(s.c_str()) << "\n";
f.close();
g.close();
return 0;
}