Pagini recente » Cod sursa (job #2922692) | Cod sursa (job #1662406) | Cod sursa (job #2199533) | Cod sursa (job #1467048) | Cod sursa (job #1461689)
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <stack>
#include <cstring>
using namespace std;
const int nmx = 100005;
char s[nmx], pol[nmx][12];
int nr ;
int prioritate(char c) {
if(c == '(' || c == ')')
return 0;
if(c == '+' || c == '-')
return 1;
return 2;
}
void forma_poloneza() {
stack <char> st;
st.push('(');
int lun = strlen(s) + 1;
s[lun-1] = ')';
for(int i = 0; i < lun; ++i) {
if(s[i] == '(') {
st.push('(');
continue;
}
if(s[i] == ')') {
while(not st.empty() && st.top() != '(') {
pol[nr++][0] = st.top();
st.pop();
}
st.pop();
continue;
}
if(isdigit(s[i])) {
int pos = 0;
while(isdigit(s[i]))
pol[nr][pos++] = s[i++];
-- i;
++ nr;
continue;
}
while(not st.empty() && prioritate(st.top()) > prioritate(s[i])) {
pol[nr++][0] = st.top();
st.pop();
}
st.push(s[i]);
}
}
int eval_expresie(){
int val1, val2, pos;
stack <int> st;
for(int i = 0; i < nr; ++i)
if(isdigit(pol[i][0])){
val1 = 0;
pos = 0;
while(pol[i][pos] >= '0' && pol[i][pos] <= '9')
val1 = val1 * 10 + (int)pol[i][pos++] - 48;
st.push(val1);
}
else if(pol[i][0] == '+'){
val1 = st.top();
st.pop();
val2 = st.top();
st.pop();
st.push(val1 + val2);
}
else if(pol[i][0] == '-'){
val1 = st.top();
st.pop();
val2 = st.top();
st.pop();
st.push(val2 - val1);
}
else if(pol[i][0] == '*'){
val1 = st.top();
st.pop();
val2 = st.top();
st.pop();
st.push(val1 * val2);
}
else{
val1 = st.top();
st.pop();
val2 = st.top();
st.pop();
st.push(val2 / val1);
}
return st.top();
}
int main() {
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
scanf("%s", s);
forma_poloneza();
printf("%d\n", eval_expresie());
return 0;
}