Pagini recente » Cod sursa (job #3039800) | Cod sursa (job #1306580) | Cod sursa (job #2030124) | Cod sursa (job #1326394) | Cod sursa (job #3131118)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
stack <char> op;
vector < string > polo(100005);
string s;
int prioritate(char x)
{
switch(x)
{
case '+':
case '-': return 1;
case '*':
case '/':
case '%': return 2;
}
return 0;
}
int main()
{
stringstream ss;
int nr1, nr2;
int n;
char aux;
fin >> s;
n = s.size();
int cnt = 0;
for(int i = 0; i < n; ++i)
{
if(s[i] >= '0' && s[i] <= '9')
{
polo[cnt].push_back(s[i]);
if(i == n - 1 || (s[i + 1] < '0' || s[i + 1] > '9'))
cnt++;
}
else
if(s[i] == ')')
{
while(op.top()!='(')
{
aux = op.top();
cnt--;
ss.clear();
ss << polo[cnt];
ss >> nr2;
polo[cnt].clear();
cnt--;
ss.clear();
ss << polo[cnt];
ss >> nr1;
polo[cnt].erase();
if(aux == '+')
nr1 = nr1 + nr2;
else
if(aux == '-')
nr1 = nr1 - nr2;
else
if(aux == '*')
nr1 = nr1 * nr2;
else
if(aux == '/')
nr1 = nr1 / nr2;
ss.clear();
ss << nr1;
ss >> polo[cnt];
ss.clear();
cnt++;
op.pop();
}
op.pop();
}
else
if(op.empty() || s[i] == '(' || prioritate(s[i]) > prioritate(op.top()))
op.push(s[i]);
else
{
while(!op.empty() && prioritate(s[i]) <= prioritate(op.top()))
{
aux = op.top();
cnt--;
ss.clear();
ss << polo[cnt];
ss >> nr2;
polo[cnt].clear();
cnt--;
ss.clear();
ss << polo[cnt];
ss >> nr1;
polo[cnt].clear();
if(aux == '+')
nr1 = nr1 + nr2;
else
if(aux == '-')
nr1 = nr1 - nr2;
else
if(aux == '*')
nr1 = nr1 * nr2;
else
if(aux == '/')
nr1 = nr1 / nr2;
ss.clear();
ss << nr1;
ss >> polo[cnt];
ss.clear();
cnt++;
op.pop();
}
op.push(s[i]);
}
}
while(!op.empty())
{
aux = op.top();
cnt--;
ss.clear();
ss << polo[cnt];
ss >> nr2;
polo[cnt].clear();
cnt--;
ss.clear();
ss << polo[cnt];
ss >> nr1;
polo[cnt].clear();
if(aux == '+')
nr1 = nr1 + nr2;
else
if(aux == '-')
nr1 = nr1 - nr2;
else
if(aux == '*')
nr1 = nr1 * nr2;
else
if(aux == '/')
nr1 = nr1 / nr2;
ss.clear();
ss << nr1;
ss >> polo[cnt];
ss.clear();
cnt++;
op.pop();
}
ss.clear();
ss << polo[0];
ss >> nr1;
fout << nr1;
return 0;
}