Pagini recente » Cod sursa (job #1175808) | Cod sursa (job #1557640) | Cod sursa (job #1714593) | Cod sursa (job #192868) | Cod sursa (job #2220746)
#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;
vector<char> st;
deque<int> numere;
deque<char> caractere;
vector<int> rez;
void calculate(char ch){
int b = -1, y = -1, z = 1;
b = rez.back();
rez.pop_back();
y = rez.back();
rez.pop_back();
if(x != -1 && y != -1){
switch(ch){
case '^':
while(b){
if(b % 2) z *= y;
else {
y *= y;
b /= 2;
}
}
break;
case '*':
z = y*b;
break;
case '/':
z = y/b;
break;
case '+':
z = y + b;
break;
case '-':
z = y - x;
break;
default : break;
}
}
rez.push_back(z);
}
int grade(char ch){
switch(ch){
case '^': return 4;
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){
x = x*10 + (s[i] - '0');
i++;
}
if(x){
i--;
caractere.push_back('n');
numere.push_back(x);
x = 0;
}else{
while(!st.empty() && st.back() != '(' && (grade(st.back()) > grade(s[i]) || (grade(st.back()) == grade(s[i]) && st.back() != '^'))){
caractere.push_back(st.back());
st.pop_back();
}
if(s[i] == '(')
st.push_back(s[i]);
else if(s[i] == ')'){
while(st.back() != '('){
caractere.push_back(st.back());
st.pop_back();
}
st.pop_back();
}else st.push_back(s[i]);
}
}
while(!st.empty()){
caractere.push_back(st.back());
st.pop_back();
}
while(!caractere.empty()){
if(caractere.front() == 'n'){
rez.push_back(numere.front());
numere.pop_front();
caractere.pop_front();
}else{
calculate(caractere.front());
caractere.pop_front();
}
}
g<<rez.back();
return 0;
}