Pagini recente » Cod sursa (job #2261325) | Cod sursa (job #1535485) | Cod sursa (job #3126875) | Cod sursa (job #2084787) | Cod sursa (job #1251718)
#include <fstream>
#include <cstring>
#include <stack>
#define Smax 100100
#define Cmax (1 << 8)
using namespace std;
stack <char> Stack;
int N, M, Result, Integers[Smax], V[Smax], Priority[Cmax];
char A[Smax], polishForm[Smax];
void move() {
polishForm[++M] = Stack.top();
Stack.pop();
}
int addInteger(int index) {
for(++N ;'0' <= A[index] && A[index] <= '9'; index++)
Integers[N] = 10 * Integers[N] + A[index] - '0';
return (index - 1);
}
void Evaluate() {
int i, Top;
N = 1;
Top = 0;
for(i = 1; i <= M; i++)
switch(polishForm[i]) {
case '@':
V[++Top] = Integers[N++];
break;
case '+':
V[Top - 1] = V[Top - 1] + V[Top--];
break;
case '-':
V[Top - 1] = V[Top - 1] - V[Top--];
break;
case '*':
V[Top - 1] = V[Top - 1] * V[Top--];
break;
case '/':
V[Top - 1] = V[Top - 1] / V[Top--];
break;
}
Result = V[1];
}
void Transform() {
int i;
Priority['+'] = Priority['-'] = 1;
Priority['*'] = Priority['/'] = 2;
for(i = 1; A[i]; i++) {
if(isdigit(A[i])) {
i = addInteger(i);
polishForm[++M] = '@';
}
else
if(A[i] == '(')
Stack.push('(');
else
if(A[i] == ')') {
while(Stack.top() != '(')
move();
Stack.pop();
}
else {
while(!Stack.empty() && Priority[A[i]] <= Priority[Stack.top()])
move();
Stack.push(A[i]);
}
}
while(!Stack.empty())
move();
}
void Read() {
ifstream in("evaluare.in");
in.getline(A + 1, Smax);
in.close();
}
void Write() {
ofstream out("evaluare.out");
out << Result << '\n';
out.close();
}
int main() {
Read();
Transform();
Evaluate();
Write();
return 0;
}