Pagini recente » Cod sursa (job #1623538) | Cod sursa (job #2766218) | Cod sursa (job #2905239) | Cod sursa (job #2598990) | Cod sursa (job #1462894)
//Evaluare expresie folosind forma poloneza, evaluez direct sirul fara sa formez in prealabil forma poloneza
#include <fstream>
#include <stack>
#include <vector>
#include <string.h>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
#define MAXSIR 100005
char sir[MAXSIR],expr[MAXSIR][15];
int n;
stack<char> st;
stack<int> st_expr;
int prioritate(char semn)
{
if(semn == '(' || semn == ')')
return 0;
if(semn == '+' || semn == '-')
return 1;
if(semn == '*' || semn=='/')
return 2;
}
int calculeaza(int a, int b, char semn)
{
if(semn=='+')
return b+a;
if(semn=='-')
return b-a;
if(semn=='*')
return b*a;
if(semn=='/')
return b/a;
}
void procesare()
{
int a=st_expr.top(); st_expr.pop();
int b=st_expr.top(); st_expr.pop();
st_expr.push( calculeaza(a,b,st.top()) );
st.pop();
}
int eval_expr(char sir[])
{
int lim,i,j;
lim=strlen(sir);
for(i=0; i<lim; i++)
{
//Pun in stiva cu semne
if(sir[i]=='(')
{
st.push('(');
continue;
}
//Pun in stiva cu numere
if(isdigit(sir[i]))
{
int c=0,nr=0;
while(isdigit(sir[i]))
nr=nr*10+sir[i++]-'0';
st_expr.push(nr);
i--; n++;
continue;
}
//Scot din stiva cu semne si calculez in cea cu numere
if(sir[i]==')')
{
while(!st.empty() && st.top()!='(')
procesare();
st.pop();
continue;
}
//Adaug in stiva cu semne si calculez in cea cu numere daca e nevoie
if(sir[i]=='+' || sir[i]=='-' || sir[i]=='*' || sir[i]=='/')
{
while(!st.empty() && prioritate(st.top()) >= prioritate(sir[i]))
procesare();
st.push(sir[i]);
}
}
while(!st.empty())
procesare();
return st_expr.top();
}
int main()
{
cin.getline(sir,MAXSIR);
cout<<eval_expr(sir);
}