Pagini recente » Statistici Stefan Catalina (StefanCatalina) | Cod sursa (job #2490665) | Cod sursa (job #2195288) | Cod sursa (job #522662) | Cod sursa (job #964685)
Cod sursa(job #964685)
#include <fstream>
#include <string.h>
#include <iostream>
#include <cstdlib>
#include <stack>
#include <math.h>
#define max 100000
#define max2 10000
using namespace std;
char caract[max];
struct element{
int x;
char c;
bool b;
};
element elems[max];
int size = 0;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int prec(char c){
switch(c){
case '+':case '-': return 0;
case '*':case '/': return 1;
}
}
bool is_digit(char c){
return ('0' <= c) && (c <= '9');
}
bool is_operator(char c){
return (c == '+') || (c == '-') || (c == '*') || (c == '/');
}
bool is_left(char c){
return (c == '(');
}
bool is_right(char c){
return (c == ')');
}
void polish(){
int len = strlen(caract), ind = 0;
char c, top;
stack<char> mystack;
while(ind < len){
c = caract[ind];
//cout<<"caracterul "<<c<<" \n";
if(is_left(c)){
// e paranteza "("
mystack.push(c);
}else{
if(is_right(c)){
// e paranteza ")"
while(!mystack.empty() && (top = mystack.top()) != '('){
mystack.pop();
elems[size].c = top;
elems[size].b = false;
size++;
}
mystack.pop();
}else{
if (is_operator(c)){
// este + - * sau /
while(!mystack.empty() && (top = mystack.top()) && is_operator(top) && prec(top) >= prec(c)){
//cout<<"top "<<top<<"\n";
//cout<<"c "<<c<<"\n";
mystack.pop();
elems[size].c = top;
elems[size].b = false;
size++;
}
mystack.push(c);
}else{
// este cifra!! nu numar!!
int number = c - 48;
while(is_digit(caract[ind+1])){
number = number * 10 + caract[ind+1] - 48;
ind++;
}
elems[size].x = number;
elems[size].b = true;
size++;
}
}
}
ind++;
}
while(!mystack.empty()){
elems[size].c = mystack.top();
elems[size].b = false;
mystack.pop();
size++;
}
}
int eval(char c, int nr1, int nr2){
switch(c){
case '+': return nr1+nr2;
case '*': return nr1*nr2;
case '/': return nr2/nr1;
case '-': return nr2-nr1;
}
}
void compute(){
int i = 0, nr1, nr2;
stack<int> mystack;
for(i = 0; i < size; i++){
if(elems[i].b == true){
// daca e numar
mystack.push(elems[i].x);
}else{
nr1 = mystack.top();
mystack.pop();
nr2 = mystack.top();
mystack.pop();
mystack.push(eval(elems[i].c,nr1,nr2));
}
}
fout<<mystack.top();
mystack.pop();
}
int main(){
fin>>caract;
polish();
compute();
return 0;
}