Pagini recente » Cod sursa (job #37432) | Cod sursa (job #1279233) | Cod sursa (job #1904090) | Cod sursa (job #109844) | Cod sursa (job #2682521)
#include <bits/stdc++.h>
#include <string.h>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
stack <char> ops;
stack <long long> numbers;
long long a, b;
long long getResult(long long n1, long long n2, char c) {
if (c == '+')
return n2+n1;
else if (c == '-')
return n2-n1;
else if (c == '*')
return n2*n1;
else if (c == '/')
return n2/n1;
else
return 0;
}
void evaluate(bool oneStep) {
string op;
while (ops.empty() == false) {
op = ops.top();
ops.pop();
if (op[0] == '(')
break;
a = numbers.top();
numbers.pop();
b = numbers.top();
numbers.pop();
numbers.push(getResult(a, b, op[0]));
if (oneStep)
break;
}
}
bool isOperator(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')');
}
int getOperatorPriority(char c) {
if (c == '(' || c == ')')
return 0;
else if (c == '+' || c == '-')
return 1;
else if (c == '*' || c == '/')
return 2;
else
return -1;
}
string nextToken = "";
bool readToken(string& token) {
char c;
token = nextToken;
nextToken = "";
if (token != "")
return true;
while (f >> c) {
if (isOperator(c))
if (token != "") {
nextToken = c;
return true;
} else {
token = c;
return true;
}
else
token += c;
}
return (token != "");
}
long long convertToInt(string n)
{
char str[n.size()];
for (int i = 0; i < n.size(); i++)
str[i] = n[i];
return atoi(str);
}
int main() {
string token;
while (readToken(token)) {
if (token == "(") {
ops.push(token[0]);
} else if (token == ")") {
evaluate(false);
} else if (isOperator(token[0])) {
if (ops.empty() == false && getOperatorPriority(token[0]) <= getOperatorPriority(ops.top()))
evaluate(true);
ops.push(token[0]);
} else {
long long nr = convertToInt(token);
numbers.push(nr);
}
}
evaluate(true);
g << numbers.top();
return 0;
}