Pagini recente » Cod sursa (job #2538539) | Cod sursa (job #1429190) | Cod sursa (job #2616321) | Cod sursa (job #2897682) | Cod sursa (job #2923706)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
string s;
stack <int> sv;
stack <char> sc;
int prioritate(char op)
{
if(op == '*' || op == '/')
return 2;
return 1;
}
int apply(int v1, int v2, char c)
{
if(c == '/')
return v1 / v2;
if(c == '*')
return v1 * v2;
if(c == '+')
return v1 + v2;
if(c == '-')
return v1 - v2;
return 0;
}
bool estecif(char c)
{
if(c >= '0' && c <= '9')
return true;
return false;
}
int eval()
{
for(int i = 0 ; i < s.size() ; i++)
{
if(s[i] == ' ')
continue;
if(estecif(s[i]))
{
int val = 0;
while(i < s.size() && estecif(s[i]))
{
val = val * 10 + s[i] - '0';
i++;
}
i--;
sv.push(val);
}
else if(s[i] == '(')
sc.push('(');
else if(s[i] == ')')
{
while(sv.size() >= 2 && !sc.empty() && sc.top() != '(')
{
int v1 = sv.top();
sv.pop();
int v2 = sv.top();
sv.pop();
char op = sc.top();
sc.pop();
int ans = apply(v2, v1, op);
sv.push(ans);
}
if(sc.empty() != 1 && sc.top() == '(')
sc.pop();
}
else
{
while(sv.size() >= 2 && !sc.empty() && prioritate(sc.top()) >= prioritate(s[i]))
{
int v1 = sv.top();
sv.pop();
int v2 = sv.top();
sv.pop();
char op = sc.top();
sc.pop();
int ans = apply(v2, v1, op);
sv.push(ans);
}
sc.push(s[i]);
}
}
while(sv.size() >= 2 && !sc.empty())
{
int v1 = sv.top();
sv.pop();
int v2 = sv.top();
sv.pop();
char op = sc.top();
sc.pop();
int ans = apply(v2, v1, op);
sv.push(ans);
}
return sv.top();
}
int main()
{
fin >> s;
int ans = eval();
fout << ans;
return 0;
}