Pagini recente » Cod sursa (job #802971) | Cod sursa (job #2222713) | Cod sursa (job #1579150) | Cod sursa (job #1641726) | Cod sursa (job #1451730)
#include <stdio.h>
#include <vector>
#include <string.h>
#include <stdlib.h>
#define MAX 100000
using namespace std;
void polish(char* expr, vector<char> s, int v[], int* n);
int eval(int v[], int n);
int main(){
vector<char> s;
int v[MAX], n, i;
char* expr = (char*)malloc(MAX);
scanf("%s", expr);
polish(expr, s, v, &n);
printf("%d\n", eval(v, n));
return 0;
}
void polish(char* expr, vector<char> s, int v[], int* n){
int x = 0, i;
*n = 0;
for(i = 0; i < strlen(expr); i++){
if('0' <= expr[i] && expr[i] <= '9')
x = 10 * x + expr[i] - '0';
else{
if(i > 0 && '0' <= expr[i - 1] && expr[i - 1] <= '9'){
v[*n] = x;
++(*n);
x = 0;
}
if(expr[i] == '(')
s.push_back(expr[i]);
if(expr[i] == ')'){
while(s.back() != '('){
v[*n] = s.back() - 48;
++(*n);
s.pop_back();
}
s.pop_back();
}
if(expr[i] == '*' || expr[i] == '/'){
if(!s.empty() && (s.back() == '*' || s.back() == '/')){
v[*n] == s.back() - 48;
++(*n);
s.pop_back();
}
s.push_back(expr[i]);
}
if(expr[i] == '+' || expr[i] == '-'){
if(!s.empty() && s.back() != '('){
v[*n] = s.back() - 48;
++(*n);
s.pop_back();
}
s.push_back(expr[i]);
}
}
}
if(x != 0){
v[*n] = x;
++(*n);
}
while(!s.empty()){
v[*n] = s.back() - 48;
++(*n);
s.pop_back();
}
}
int eval(int v[], int n){
int i, rez = 0, a, b;
vector<int> s;
for(i = 0; i < n; i++){
if(v[i] > 0)
s.push_back(v[i]);
else{
b = s.back();
s.pop_back();
a = s.back();
s.pop_back();
switch(v[i]){
case -6: rez = a * b; break;
case -5: rez = a + b; break;
case -3: rez = a - b; break;
case -1: rez = a / b; break;
}
s.push_back(rez);
}
}
return s.back();
}