Pagini recente » Cod sursa (job #208271) | Cod sursa (job #967294) | Cod sursa (job #1474838) | Cod sursa (job #2927678) | Cod sursa (job #2790183)
#include <iostream>
#include <fstream>
#include <stack>
#include <string>
#include <vector>
#include <ctype.h>
#define LMAX 100000
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int precedence(char ch)
{
if (ch == '^') return 3;
if (ch == '*' || ch == '/') return 2;
if (ch == '+' || ch == '-') return 1;
return 0;
}
bool isOperator(char ch)
{
if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
return true;
return false;
}
string infixToPostfix()
{
stack <char> st;
string out = "";
char ch, tmp;
do
{
ch = fin.get();
if (!isalnum(ch)) out += ' ';
if (isalnum(ch)) out += ch;
else if (ch == '(') st.push(ch);
else if (ch == ')')
{
while (!st.empty() && st.top() != '(')
{
out += st.top();
st.pop();
}
st.pop();
}
else
{
out += ' ';
if (ch == '^') st.push(ch);
else
{
while (!st.empty() && precedence(ch) <= precedence(st.top()))
{
out += st.top();
st.pop();
}
st.push(ch);
}
}
}
while (ch != EOF);
while (!st.empty())
{
out += st.top();
st.pop();
}
return out;
}
int operation(char op, int first, int second)
{
switch(op)
{
case '+':
{
return second + first;
break;
}
case '-':
{
return second - first;
break;
}
case '*':
{
return second * first;
break;
}
default:
{
return second / first;
break;
}
}
}
int compute(string s)
{
int number = 0, i = 0, first, second;
stack <int> st;
for (int i = 0; i < s.size(); i++)
{
if (isdigit(s[i]))
{
int temp = 0;
while (isdigit(s[i]))
{
temp *= 10;
temp += s[i++] - '0';
}
st.push(temp);
}
else if (isOperator(s[i]))
{
first = st.top(), st.pop();
second = st.top(), st.pop();
st.push(operation(s[i], first, second));
}
}
return st.top();
}
int main()
{
fout << compute(infixToPostfix());
fin.close();
fout.close();
return 0;
}