Pagini recente » Cod sursa (job #1572312) | Cod sursa (job #2895624) | Cod sursa (job #1310274) | Cod sursa (job #1235496) | Cod sursa (job #3342172)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
string s;
stack<char> st_op;
stack<int> st_nr;
int prioritate[260];
int32_t main(){
prioritate['+'] = prioritate['-'] = 1;
prioritate['*'] = prioritate['/'] = 2;
int i, nr, j,a, b, ans=0, n;
char op;
fin >> s;
n = s.size();
for(i=0;i<n;i++){
/* stack<int> st1 = st_nr;
stack<char> st2 = st_op;
while(!st1.empty()){
fout << st1.top() << " " ;
st1.pop();
}
fout << endl;
while(!st2.empty()){
fout << st2.top() << " " ;
st2.pop();
}
fout << endl << endl;*/
if(s[i] == '('){
st_op.push('(');
continue;
}
if(isdigit(s[i])){
nr=0;
for(j=i;j<n&&isdigit(s[j]);j++)
nr = nr * 10 + (s[j]-'0');
i = j-1;
st_nr.push(nr);
continue;
}
if(s[i] == ')'){
while(st_op.top() != '('){
a = st_nr.top();
st_nr.pop();
b = st_nr.top();
st_nr.pop();
op = st_op.top();
st_op.pop();
if(op == '*')
nr = b*a;
if(op == '/')
nr = b/a;
if(op == '-')
nr = b-a;
if(op == '+')
nr = b+a;
st_nr.push(nr);
}
st_op.pop(); /// (
continue;
}
while(!st_op.empty() && prioritate[st_op.top()] >= prioritate[s[i]]){
a = st_nr.top();
st_nr.pop();
b = st_nr.top();
st_nr.pop();
op = st_op.top();
st_op.pop();
if(op == '*')
nr = b*a;
if(op == '/')
nr = b/a;
if(op == '-')
nr = b-a;
if(op == '+')
nr = b+a;
st_nr.push(nr);
}
st_op.push(s[i]);
}
while(!st_op.empty()){
a = st_nr.top();
st_nr.pop();
b = st_nr.top();
st_nr.pop();
op = st_op.top();
st_op.pop();
if(op == '*')
nr = b*a;
if(op == '/')
nr = b/a;
if(op == '-')
nr = b-a;
if(op == '+')
nr = b+a;
st_nr.push(nr);
}
fout << st_nr.top();
}