Pagini recente » Cod sursa (job #1323427) | Cod sursa (job #334300) | Cod sursa (job #347271) | Cod sursa (job #1396506) | Cod sursa (job #1467231)
#include <fstream>
#include <vector>
#include <string.h>
using namespace std;
char text[100001], postfix[100001];
vector<int> numbers;
vector<char> expression;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
int getNumber(int *i) {
int number = 0;
while(text[*i] >= '0' && text[*i] <= '9') {
number = number * 10 + (text[*i] - '0');
(*i)++;
}
return number;
}
int higherPreced(char a, char b) {
if(a == '*' || a == '/')
return 1;
else {
if( (a == '+' || a == '-' ) &&
(b == '+' || b == '-') )
return 1;
else
return 0;
}
}
void parseText() {
int i = 0, n = strlen(text), opN = -1;
vector<char> opStack = vector<char>();
expression = vector<char>();
numbers = vector<int>();
while(i < n) {
if(text[i] == '+' || text[i] == '-'
|| text[i] == '*' || text[i] == '/') {
while(opN >= 0 && higherPreced(opStack.at(opN), text[i])) {
expression.push_back(opStack.at(opN));
opStack.pop_back();
opN--;
}
opStack.push_back(text[i]);
opN++;
}
else if(text[i] == '(') {
opStack.push_back(text[i]);
opN++;
} else if(text[i] == ')') {
while(opStack.at(opN) != '(') {
expression.push_back(opStack.at(opN));
opStack.pop_back();
opN--;
}
} else {
expression.push_back('N');
numbers.push_back(getNumber(&i));
i--;
}
i++;
}
while(opN >= 0) {
if(opStack.at(opN) != '(')
expression.push_back(opStack.at(opN));
opStack.pop_back();
opN--;
}
}
int calculate() {
int i = 0, n = expression.size(), nNumbers = 0, nStack = -1;
vector<int> resultStack = vector<int>();
while(i < n) {
if(expression.at(i) == 'N') {
resultStack.push_back(numbers.at(nNumbers));
nStack++;
nNumbers++;
}
else {
int b = resultStack.at(nStack);
int a = resultStack.at(nStack - 1);
resultStack.pop_back();
resultStack.pop_back();
switch(expression.at(i)) {
case '+':
b = a + b;
break;
case '-':
b = a - b;
break;
case '*':
b = a * b;
break;
case '/':
b = a / b;
break;
}
resultStack.push_back(b);
nStack--;
}
i++;
}
return resultStack.at(0);
}
int main()
{
f>>text;
parseText();
g<<calculate();
return 0;
}