Pagini recente » Cod sursa (job #2715848) | Cod sursa (job #1491743) | Cod sursa (job #171532) | Cod sursa (job #3142798) | Cod sursa (job #2220800)
#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>
#include <deque>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char s[100005];
int x, n;
bool ok;
vector<char> st;
vector<int> rez;
void calculate(char ch){
int b = 0, y = 0, z = 1;
b = rez.back();
rez.pop_back();
y = rez.back();
rez.pop_back();
switch(ch){
case '*':
z = y*b;
break;
case '/':
z = y/b;
break;
case '+':
z = y + b;
break;
case '-':
z = y - b;
break;
default : break;
}
rez.push_back(z);
}
int grade(char ch){
switch(ch){
case '/': return 3;
case '*': return 3;
case '-': return 2;
case '+': return 2;
default: break;
}
return 0;
}
int main()
{
f.getline(s, 100005);
n = strlen(s);
for(int i = 0; i < n; i++){
while(s[i] >= '0' && s[i] <= '9' && i < n){
ok = 1;
x = x*10 + (s[i] - '0');
i++;
}
if(ok){
i--;
rez.push_back(x);
x = 0;
ok = 0;
}else{
if(s[i] == '+' || s[i] == '-' || s[i] == '/' || s[i] == '*'){
while(!st.empty() && st.back() != '(' && (grade(st.back()) > grade(s[i]) || (grade(st.back()) == grade(s[i])))){
calculate(st.back());
st.pop_back();
}
}
if(s[i] == '(')
st.push_back(s[i]);
else if(s[i] == ')'){
while(st.back() != '('){
calculate(st.back());
st.pop_back();
}
st.pop_back();
}else st.push_back(s[i]);
}
}
while(!st.empty()){
calculate(st.back());
st.pop_back();
}
g<<rez.back();
return 0;
}