Pagini recente » Cod sursa (job #278026) | Cod sursa (job #577926) | Cod sursa (job #2863106) | Cod sursa (job #3209018) | Cod sursa (job #1651367)
#include <iostream>
#include <cstdio>
#include <string.h>
#include <math.h>
using namespace std;
struct stiva1
{
int semne[100002];
int ordin[100002];
int ultimul=-1;
}stk1;
struct stiva2
{
int numere[100002];
int ultimul_nr=-1;
}stk2;
void push1(int semn, int ordin)
{
stk1.ultimul++;
stk1.semne[stk1.ultimul] = semn;
stk1.ordin[stk1.ultimul] = ordin;
}
void push2(int nr)
{
stk2.ultimul_nr++;
stk2.numere[stk2.ultimul_nr] = nr;
}
void pop1()
{
stk1.ultimul--;
}
void pop2()
{
stk2.ultimul_nr--;
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
char s[100002];
int i=0,x=0,k=0,t=0,e=0;
cin>>s;
s[strlen(s)]='#';
s[-1]='#';
while(s[i]!='\0')
{
switch (s[i])
{
case '+':
if(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/'||s[i-1]=='^'||s[i-1]=='(')
e=1;
else
push1(s[i],1+k);
x=0;
break;
case '-':
if(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/'||s[i-1]=='^')
e=1;
else if(s[i-1]=='(')
t=1;
else
push1(s[i],1+k);
x=0;
break;
case '*':
if(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/'||s[i-1]=='^'||s[i-1]=='(')
e=1;
else
push1(s[i],2+k);
x=0;
break;
case '/':
if(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/'||s[i-1]=='^'||s[i-1]=='(')
e=1;
else
push1(s[i],2+k);
x=0;
break;
case '^':
if(s[i-1]=='+'||s[i-1]=='-'||s[i-1]=='*'||s[i-1]=='/'||s[i-1]=='^'||s[i-1]=='(')
e=1;
else
push1(s[i],3+k);
x=0;
break;
case '(':
k=k+10;
break;
case ')':
k=k-10;
break;
case '#':
push1(s[i],0);
x=0;
break;
default:
x = x * 10 + int(s[i]-'0');
if(s[i+1]<'0'||s[i+1]>'9')
{
if(t==1)
push2(0-x);
else
push2(x);
t=0;
}
break;
}
i++;
if(stk2.ultimul_nr>=1&&stk1.ordin[stk1.ultimul-1]>=stk1.ordin[stk1.ultimul]) //sunt cel putin doua numere in stiva 2 si semnul din stanga are ordin mai mare sau egal decat cel din dreapta
{
pop2();
pop2();
pop1();
if(stk1.semne[stk1.ultimul]=='/')
{
push2(stk2.numere[stk2.ultimul_nr+1] / stk2.numere[stk2.ultimul_nr+2]);
}
if(stk1.semne[stk1.ultimul]=='*')
{
push2(stk2.numere[stk2.ultimul_nr+1] * stk2.numere[stk2.ultimul_nr+2]);
}
if(stk1.semne[stk1.ultimul]=='+')
{
push2(stk2.numere[stk2.ultimul_nr+1] + stk2.numere[stk2.ultimul_nr+2]);
}
if(stk1.semne[stk1.ultimul]=='-')
{
push2(stk2.numere[stk2.ultimul_nr+1] - stk2.numere[stk2.ultimul_nr+2]);
}
if(stk1.semne[stk1.ultimul]=='^')
{
push2(powf(stk2.numere[stk2.ultimul_nr+1],stk2.numere[stk2.ultimul_nr+2]));
}
pop1();
i--;
}
}
if(e!=0)
cout<<"Eroare sintaxa! Operator langa operator.";
else if(k==0)
cout<<stk2.numere[stk2.ultimul_nr];
else if(k>0)
cout<<"Eroare! Nu se inchid toate parantezele.";
else
cout<<"Eroare! Se incearca inchiderea mai multor paranteze decat sunt deschise.";
return 0;
}