Pagini recente » Cod sursa (job #2833914) | Cod sursa (job #3262956) | Cod sursa (job #433530) | Cod sursa (job #279989) | Cod sursa (job #2912494)
#include <fstream>
#include <string>
#include <vector>
#include <stack>
class asn{
public:
virtual int execute(){
return 0;
};
};
class asn_sum : public asn{
public:
asn *lho, *rho;
int execute(){
return lho->execute()+rho->execute();
}
};
class asn_dif : public asn{
public:
asn *lho, *rho;
int execute(){
return lho->execute()-rho->execute();
}
};
class asn_prod : public asn{
public:
asn *lho, *rho;
int execute(){
return lho->execute()*rho->execute();
}
};
class asn_div : public asn{
public:
asn *lho, *rho;
int execute(){
return lho->execute()/rho->execute();
}
};
class asn_num : public asn{
public:
int x;
int execute(){
return x;
}
};
std::ifstream fin("evaluare.in");
std::ofstream fout("evaluare.out");
std::string s;
std::vector <std::string> t;
std::vector <int> p;
std::stack <int> st;
asn *ast(int l, int r){
if(r<l){
asn_num *sol=new asn_num;
sol->x=0;
return sol;
}else if(r==l){
asn_num *sol=new asn_num;
int aux=0;
for(int i=0;i<int(t[l].size());i++){
aux=aux*10+t[l][i]-'0';
}
sol->x=aux;
return sol;
}else{
int i=r;
while(i>=l&&t[i][0]!='+'&&t[i][0]!='-'){
if(t[i][0]==')'){
i=p[i];
}
i--;
}
if(i>=l){
if(t[i][0]=='+'){
asn_sum *sol=new asn_sum;
sol->lho=ast(l,i-1);
sol->rho=ast(i+1,r);
return sol;
}else{
asn_dif *sol=new asn_dif;
sol->lho=ast(l,i-1);
sol->rho=ast(i+1,r);
return sol;
}
}
i=r;
while(i>=l&&t[i][0]!='*'&&t[i][0]!='/'){
if(t[i][0]==')'){
i=p[i];
}
i--;
}
if(i>=l){
if(t[i][0]=='*'){
asn_prod *sol=new asn_prod;
sol->lho=ast(l,i-1);
sol->rho=ast(i+1,r);
return sol;
}else{
asn_div *sol=new asn_div;
sol->lho=ast(l,i-1);
sol->rho=ast(i+1,r);
return sol;
}
}
return ast(l+1,r-1);
}
}
int main(){
fin>>s;
int n=int(s.size());
for(int i=0;i<n;i++){
if(s[i]>='0'&&s[i]<='9'){
std::string aux;
while(i<n&&s[i]>='0'&&s[i]<='9'){
aux+=s[i];
i++;
}
i--;
t.push_back(aux);
}else{
std::string aux;
aux+=s[i];
t.push_back(aux);
}
}
n=t.size();
p.resize(n);
for(int i=0;i<n;i++){
if(t[i][0]=='('){
st.push(i);
}else if(t[i][0]==')'){
p[i]=st.top();
p[st.top()]=i;
st.pop();
}
}
asn *r=ast(0,n-1);
fout<<r->execute();
return 0;
}