Pagini recente » Cod sursa (job #1136733) | Cod sursa (job #2216349) | Cod sursa (job #461248) | Cod sursa (job #2095182) | Cod sursa (job #808655)
Cod sursa(job #808655)
#include <cstdio>
#include <deque>
#include <cstring>
#include <iostream>
using namespace std;
char S[1000000];
void dump(deque<int> d) {
for (int i = 0; i < d.size(); i++) {
cout << d[i] << " ";
}
cout << endl;
}
void dump(deque<char> d) {
for (int i = 0; i < d.size(); i++) {
cout << d[i] << " ";
}
cout << endl;
}
int next_int(deque<char> & A) {
int n = 0;
int sign = 1;
if (!A.empty() && A.front() == '-') {
sign = -1;
A.pop_front();
}
while (!A.empty() && '0' <= A.front() && A.front() <= '9') {
n = n * 10 + A.front() - '0';
A.pop_front();
}
return n * sign;
}
int f2(deque<char> & A) {
deque<int> ans;
int a, b;
while (!A.empty()) {
switch (A.front()) {
case '+':
A.pop_front();
ans.push_back(next_int(A));
break;
case '-':
A.pop_front();
ans.push_back(-next_int(A));
break;
case '/':
A.pop_front();
a = ans.back();
ans.pop_back();
b = next_int(A);
ans.push_back(a / b);
break;
case '*':
A.pop_front();
a = ans.back();
ans.pop_back();
b = next_int(A);
ans.push_back(a * b);
break;
default:
ans.push_back(next_int(A));
break;
}
}
int n = 0;
while (!ans.empty()) {
n += ans.front();
ans.pop_front();
}
return n;
}
int f1(deque<char> & A) {
deque<char> B;
while (!A.empty()) {
char c = A.front();
A.pop_front();
if (c == ')') {
deque<char> d;
while (c = B.back(), B.pop_back(), c != '(') {
d.push_front(c);
}
char str[20];
sprintf(str, "%d", f2(d));
int size = strlen(str);
for (int i = 0; i < size; i++) {
B.push_back(str[i]);
}
} else {
B.push_back(c);
}
}
return f2(B);
}
int main() {
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
scanf("%s", S);
deque<char> V;
for (int i = 0, size = strlen(S); i < size; i++) {
V.push_back(S[i]);
}
V.push_front('(');
V.push_back(')');
printf("%d\n", f1(V));
return 0;
}