Pagini recente » Cod sursa (job #1050971) | Istoria paginii runda/igorj_3 | Cod sursa (job #2048362) | Cod sursa (job #1891263) | Cod sursa (job #2061669)
#include <fstream>
#include <cctype>
#include <cstring>
#include <vector>
#include <stack>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
char s[10001];
vector<int>polo;
stack<char>op;
inline int prior(char ch)
{
switch(ch)
{
case'*':
case'/':
case'%':return 2;
case'+':
case'-':return 1;
default:return 0;
}
}
int main()
{
in.getline(s,10001);
int n,i,a,b;
n=strlen(s);
int nr=0,number=0;
for(i=0;i<n;i++)
{
if(isdigit(s[i]))
{
nr=nr*10+s[i]-'0';
number=1;
continue;
}
else if(number==1)
{
polo.push_back(nr);
nr=0;
number=0;
}
if(s[i]=='(')
{
op.push(s[i]);
continue;
}
if(s[i]==')')
{
while(!op.empty() && op.top()!='(')
{
switch(op.top())
{
case '+':a=polo.back();
polo.pop_back();
b=polo.back();
polo.pop_back();
polo.push_back(a+b);
break;
case '-':a=polo.back();
polo.pop_back();
b=polo.back();
polo.pop_back();
polo.push_back(b-a);
break;
case '*':a=polo.back();
polo.pop_back();
b=polo.back();
polo.pop_back();
polo.push_back(a*b);
break;
case '/':a=polo.back();
polo.pop_back();
b=polo.back();
polo.pop_back();
polo.push_back(b/a);
break;
}
op.pop();
}
op.pop();
continue;
}
if(op.empty() || prior(s[i])>prior(op.top()))
op.push(s[i]);
else
{
while(!op.empty() && prior (s[i])<=prior(op.top()))
{
switch(op.top())
{
case '+':a=polo.back();
polo.pop_back();
b=polo.back();
polo.pop_back();
polo.push_back(a+b);
break;
case '-':a=polo.back();
polo.pop_back();
b=polo.back();
polo.pop_back();
polo.push_back(b-a);
break;
case '*':a=polo.back();
polo.pop_back();
b=polo.back();
polo.pop_back();
polo.push_back(a*b);
break;
case '/':a=polo.back();
polo.pop_back();
b=polo.back();
polo.pop_back();
polo.push_back(b/a);
break;
}
op.pop();
}
op.push(s[i]);
}
}
if(number==1)
{
polo.push_back(nr);
nr=0;
number=0;
}
while(!op.empty())
{
switch(op.top())
{
case '+':a=polo.back();
polo.pop_back();
b=polo.back();
polo.pop_back();
polo.push_back(a+b);
break;
case '-':a=polo.back();
polo.pop_back();
b=polo.back();
polo.pop_back();
polo.push_back(b-a);
break;
case '*':a=polo.back();
polo.pop_back();
b=polo.back();
polo.pop_back();
polo.push_back(a*b);
break;
case '/':a=polo.back();
polo.pop_back();
b=polo.back();
polo.pop_back();
polo.push_back(b/a);
break;
}
op.pop();
}
vector<int>:: iterator it;
for(it=polo.begin();it<polo.end();it++)
out<<*it;
return 0;
}