Pagini recente » Cod sursa (job #2255800) | Cod sursa (job #1194539) | Cod sursa (job #127620) | Cod sursa (job #283058) | Cod sursa (job #1909244)
#include <bits/stdc++.h>
#define paranteza 1000000001 /// (
#define inmultire 1000000003 /// *
#define minuss 1000000002 /// -
#define impartire 1000000004 /// /
using namespace std;
char a[100007];
int st[100007];
int top;
void Read()
{
ifstream fin("evaluare.in");
fin >> a;
fin.close();
}
inline bool Cifra(char c)
{
if('0' <= c && c <= '9') return true;
return false;
}
void Solve()
{
int nr, i;
for(i = 0; a[i] != 0;)
{
if(a[i] == '(')
{
st[++top] = paranteza;
i++;
}
if(a[i] == '+')
i++;
if(a[i] == '-')
{
st[++top] = minuss;
i++;
}
if(a[i] == '*')
{
st[++top] = inmultire;
i++;
}
if(a[i] == '/')
{
st[++top] = impartire;
i++;
}
if(Cifra(a[i]))
{
nr = 0;
while(Cifra(a[i]))
{
nr = nr * 10 + (a[i] - '0'),
i++;
}
if(st[top] == minuss)
{
nr = -1 * nr;
top--;
}
while(st[top] == inmultire && top > 0)
{
top--;
nr = st[top] * nr;
top--;
}
while(st[top] == impartire && top > 0)
{
top--;
nr = st[top] / nr;
top--;
}
st[++top] = nr;
}
if(a[i] == ')')
{
nr = 0;
while(st[top] != paranteza && top > 0)
{
nr += st[top];
top--;
}
top--; /// scoatem paranteza
/// Calculam numerele din spatele parantezei
while(st[top] == inmultire && top > 0)
{
top--;
nr = st[top] * nr;
top--;
}
while(st[top] == impartire && top > 0)
{
top--;
nr = st[top] / nr;
top--;
}
if(st[top] == minuss)
{
nr = -1 * nr;
top--;
}
st[++top] = nr;
i++;
}
}
nr = 0;
for (i = 1; i <= top; i++)
nr += st[i];
ofstream fout ("evaluare.out");
fout << nr << "\n";
fout.close();
}
int main()
{
Read();
Solve();
return 0;
}