Pagini recente » Cod sursa (job #1723685) | Cod sursa (job #650058) | Cod sursa (job #2309828) | Cod sursa (job #563727) | Cod sursa (job #2355215)
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
char s[100005];
stack <char> op;
stack <int> nr;
int semn(int x, int y, char se)
{
if(se == '+')
return x+y;
if(se == '-')
return x-y;
if(se == '*')
return x*y;
if(se == '/')
return x/y;
}
void adauga()
{
int v2=nr.top();
nr.pop();
int v1=nr.top();
nr.pop();
int semnn=op.top();
op.pop();
int ele=semn(v1, v2, semnn);
nr.push(ele);
}
int ordine(char semn, char sv)
{
if(semn == '(')
return 1;
if((semn == '+' || semn == '-') && (sv == '*' || sv == '/'))
return 1;
return 0;
}
int numar(int &i)
{
int nr=0;
while(s[i]>='0' && s[i]<='9')
nr=nr*10+(s[i++]-'0');
return nr;
}
int main()
{
freopen("evaluare.in", "r", stdin);
freopen("evaluare.out", "w", stdout);
scanf("%s", s);
int n=strlen(s);
for(int i=0; i<n; i++)
{
if(s[i] == '(')
{
op.push(s[i]);
continue;
}
if(s[i] == ')')
{
while(op.top() != '(')
{
adauga();
}
op.pop();
continue;
}
if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
{
if(op.empty() || ordine(op.top(), s[i]) == 1)
op.push(s[i]);
else
{
do
{
adauga();
}
while(!op.empty() && ordine(op.top(), s[i]) == 0);
op.push(s[i]);
}
continue;
}
nr.push(numar(i));
i--;
}
while(!op.empty())// && !nr.empty())
{
adauga();
}
printf("%d", nr.top());
return 0;
}