Pagini recente » Cod sursa (job #2705024) | Cod sursa (job #520850) | Cod sursa (job #2281341) | Cod sursa (job #2880895) | Cod sursa (job #1332933)
#include <fstream>
#include <cstring>
#include <stack>
#include <queue>
#define Cmax 128
#define Smax 100100
using namespace std;
int N, Size, Result, priority[Cmax], Integer[Smax], A[Smax];
char Expression[Smax];
queue <char> polishForm;
stack <char> Stack;
void Evaluate() {
int i, top;
for(top = 0, N = 1; !polishForm.empty(); polishForm.pop())
switch(polishForm.front()) {
case '@':
A[++top] = Integer[N++];
break;
case '+':
A[top] += A[top--];
break;
case '-':
A[top] -= A[top--];
break;
case '*':
A[top] *= A[top--];
break;
case '/':
A[top] /= A[top--];
break;
}
Result = A[1];
}
void move() {
polishForm.push(Stack.top());
Stack.pop();
}
void addInteger(int & index) {
for(++N; isdigit(Expression[index]); index++)
Integer[N] = 10 * Integer[N] + (Expression[index] - '0');
--index;
}
void Transform() {
int i;
priority['+'] = priority['-'] = 1;
priority['*'] = priority['/'] = 2;
for(i = 0; Expression[i]; i++) {
if(isdigit(Expression[i])) {
addInteger(i);
polishForm.push('@');
} else
if(Expression[i] == '(')
Stack.push('(');
else
if(Expression[i] == ')') {
while(Stack.top() != '(')
move();
Stack.pop();
} else {
while(!Stack.empty() && priority[Expression[i]] <= priority[Stack.top()])
move();
Stack.push(Expression[i]);
}
}
while(!Stack.empty())
move();
}
void Read() {
ifstream in("evaluare.in");
in.getline(Expression, Smax);
in.close();
}
void Write() {
ofstream out("evaluare.out");
out << Result << '\n';
out.close();
}
int main() {
Read();
Transform();
Evaluate();
Write();
return 0;
}