Pagini recente » Cod sursa (job #582326) | Cod sursa (job #1651723) | Cod sursa (job #547659) | Cod sursa (job #2297999) | Cod sursa (job #1787867)
#include <iostream>
#include <string>
#include <fstream>
#include <stack>
#define NMAX 100001
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
int n,x,y,rez;
string s;
char c;
stack<int> numere;
stack<char> semne;
int readNr(int &x)
{
int rez = 0;
while(s[x]>='0' && s[x]<='9' && x<n)
{
rez = rez*10 + s[x]-'0';
x++;
}
//x--;
return rez;
}
int getPriority(char c)
{
int pr=0;
switch(c)
{
case '(' : pr = 0; break;
case '+' : pr = 1; break;
case '-' : pr = 1; break;
case '*' : pr = 2; break;
case '/' : pr = 2; break;
}
return pr;
}
int calcNr(int x,int y,char c)
{
int rez=0;
switch(c)
{
case '+' : rez = y+x; break;
case '-' : rez = y-x; break;
case '*' : rez = x*y; break;
case '/' : rez = y/x; break;
}
// cout << x << " " << c << " "<< y << "=" << rez <<endl;
return rez;
}
void emptyStack()
{
while(!semne.empty())
{
if(semne.top()=='(')
return;
c = semne.top(); semne.pop();
x = numere.top(); numere.pop();
y = numere.top(); numere.pop();
numere.push(calcNr(x,y,c));
}
}
int main()
{
in >>s;
n = s.size();
int i = 0;
while(i<n)
{
if(s[i]>='0' && s[i]<='9')
{
rez = readNr(i);
numere.push(rez);
//cout << rez<<" ";
}
else
{
// cout << s[i] <<" ";
if(s[i]==')')
{
// cout << semne.top();
emptyStack();
semne.pop();
}
else if(s[i]=='(')
{
semne.push(s[i]);
}
else
{
while(!semne.empty() && getPriority(s[i])<=getPriority(semne.top()))
{
// cout << s[i] << " <= " << semne.top() <<endl;
c = semne.top(); semne.pop();
x = numere.top(); numere.pop();
y = numere.top(); numere.pop();
numere.push(calcNr(x,y,c));
}
semne.push(s[i]);
}
i++;
}
}
emptyStack();
// cout <<semne.top();
out << numere.top();
return 0;
}