Pagini recente » Cod sursa (job #2121693) | Cod sursa (job #1111908) | Cod sursa (job #1739707) | Cod sursa (job #851996) | Cod sursa (job #2861978)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
struct Numar {
char valMare[10];
char valMic;
};
int main() {
char sir[100001], vf, nr[10];
int aux, index;
Numar op;
vector<Numar> v;
stack<char> st;
stack<int> rez;
fin >> sir;
// cout << sir << endl;
for(int i = 0; i < strlen(sir); i++) {
if('0' <= sir[i] && sir[i] <= '9') {
index = 0;
while( i < strlen(sir) && '0' <= sir[i] && sir[i] <= '9' ) {
nr[index++] = sir[i++];
}
nr[index] = '\0';
strcpy(op.valMare, nr);
op.valMic = '#';
v.push_back(op);
// cout << sir[i] << "? ";
//cu linia asta --> Segmentation fault! DE CE??
i--;
}
else
{
if( st.empty() ) {
st.push(sir[i]);
} else {
if( sir[i] == '(' )
st.push(sir[i]);
else {
if( (sir[i] == '*' || sir[i] == '/') && (st.top() == '*' || st.top() == '/') ) {
vf = st.top();
op.valMic = vf;
strcpy(op.valMare, "#");
st.pop();
v.push_back(op);
st.push(sir[i]);
} else if( (sir[i] == '+' || sir[i] == '-') && st.top() != '(' && st.top() != ')' ) {
vf = st.top();
op.valMic = vf;
strcpy(op.valMare, "#");
st.pop();
v.push_back(op);
st.push(sir[i]);
} else if( sir[i] == ')' ) {
while( st.top() != '(' ) {
vf = st.top();
op.valMic = vf;
strcpy(op.valMare, "#");
st.pop();
v.push_back(op);
}
st.pop();
} else {
st.push(sir[i]);
}
}
}
}
}
while( !st.empty() ) {
vf = st.top();
op.valMic = vf;
strcpy(op.valMare, "#");
st.pop();
v.push_back(op);
}
// for(int i = 0; i < v.size(); i++) {
// if( v[i].valMic == '#' )
// fout << v[i].valMare << " ";
// else if( strcmp(v[i].valMare, "#") == 0 )
// fout << v[i].valMic << " ";
// else cout << "??" << " ";
// }
// fout << endl;
int a, b;
char operatie;
for(int i = 0; i < v.size(); i++) {
// cout << v[i].valMic << " ";
//verific intai daca am un numar
if( v[i].valMic == '#' ) {
rez.push(atoi(v[i].valMare));
// cout << "Push " << atoi(v[i].valMare) << endl;
} else
if( v[i].valMic == '+' || v[i].valMic == '-' ||
v[i].valMic == '*' || v[i].valMic == '/' ) {
a = rez.top();
rez.pop();
b = rez.top();
rez.pop();
// cout << endl << b << v[i].valMic << a << endl;
if( v[i].valMic == '+' )
rez.push(a + b);
else if( v[i].valMic == '-' )
rez.push(b - a);
else if( v[i].valMic == '*' )
rez.push(a * b);
else if( v[i].valMic == '/' )
rez.push(b / a);
}else {
rez.push(atoi(&v[i].valMic));
// cout << "pushh " << atoi(&v[i].valMic) << endl;
}
}
// cout << endl;
fout << rez.top();
return 0;
}