Pagini recente » Rezultatele filtrării | Rezultatele filtrării | Rezultatele filtrării | Rezultatele filtrării | Cod sursa (job #2061614)
#include<bits/stdc++.h>
using namespace std;
const int NMAX = 1e5+5;
char s[NMAX];
vector<int> polo;
stack <char> op;
inline int prio(char ch)
{
switch(ch)
{
case '*':
case '/':
case '%': return 2;
case '+':
case '-': return 1;
default : return 0;
}
}
inline int operatie(int nr1,int nr2,char ch)
{
switch(ch)
{
case '*' : return nr1 * nr2;
case '/' : return nr1 / nr2;
case '+' : return nr1 + nr2;
case '-' : return nr1 - nr2;
}
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
int n,i,nr1,nr2;
gets(s+1);
n = strlen(s+1);
int nr;
char ch;
for(i=1;i<=n;++i)
{
if(!op.empty())
ch = op.top();
if(isdigit(s[i]))
{
nr = 0;
while(i<=n && isdigit(s[i]))
{
nr = nr*10 + (s[i]-'0');
++i;
}
--i;
polo.push_back(nr);
continue;
}
if(s[i] == '(')
{
op.push(s[i]);
continue;
}
if(s[i] == ')')
{
while(!op.empty() && op.top() != '(')
{
nr2 = polo[polo.size() - 1];
polo.pop_back();
nr1 = polo[polo.size() - 1];
polo.pop_back();
polo.push_back( operatie( nr1 , nr2 , op.top() ) );
op.pop();
}
op.pop();
continue;
}
if(op.empty() || prio( s[i] ) > prio( op.top() ) )
op.push(s[i]);
else
{
while(!op.empty() && prio(s[i]) <= prio(op.top() ) )
{
nr2 = polo[polo.size() - 1];
polo.pop_back();
nr1 = polo[polo.size() - 1];
polo.pop_back();
polo.push_back( operatie ( nr1 , nr2, op.top() ) );
op.pop();
}
op.push(s[i]);
}
}
while(!op.empty())
{
nr2 = polo[polo.size() - 1];
polo.pop_back();
nr1 = polo[polo.size() - 1];
polo.pop_back();
polo.push_back( operatie ( nr1 , nr2, op.top() ) );
op.pop();
}
printf("%d",polo[0]);
}