Cod sursa(job #2768921)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 12 august 2021 16:42:11
Problema Evaluarea unei expresii Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.21 kb
#include <iostream>
#include<fstream>
#include<cstring>
#include<stack>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
stack<int> S1; stack<char> S2;

void Out( stack < int > S1 ){
    while( S1.size() ){
        cout << S1.top() << ' ';
        S1.pop();
    }
    cout << '\n';
}

void Out( stack < char > S1 ){
    while( S1.size() ){
        cout << S1.top() << ' ';
        S1.pop();
    }
    cout << '\n';
}

int main(){
	int num =0, k=0; char c, s[100005], V[100005];
	fin >> s;

	///(1+1)*13+10/2
	for(int i=0; i<strlen(s); i++){
		if(!(s[i]>='0' && s[i]<='9')) V[++k] = s[i];
	}
	int num1=0, num2=0, in =0;

    //cout << s << '\n';

	for(int i=0; i<strlen(s); i++){

        if( !(s[i] >= '0' && s[i] <= '9') )
            in++;

        //cout << s[i] << ' ' << in << '\n';

		if(s[i] == '('){
			S2.push(s[i]);//in ++;
		}
		else if( s[i]>='0' && s[i]<='9' ){
            num1 = 0;
			while( s[i]>='0' && s[i]<='9' ){
				num1 *=10; num1 += (s[i]-'0');
				i++;
			}
			i--;
			S1.push(num1);
		}
		else if( s[i] == '*'){
			//in ++;
			if(s[i+1] != '('){
				i++;
                num2 = 0;
				while( s[i]>='0' && s[i]<='9' ){
					num2 *=10; num2+=(s[i] -'0');
					i++;
				}
				i--;
				int num = S1.top() * num2;
				S1.pop(); S1.push(num);
			}
			else{
				S2.push('*');
			}
		}
		else if( s[i] == '/'){
			//in++;
			if(s[i+1] != '('){
				i++;
				num2 = 0;
				while( s[i]>='0' && s[i]<='9' ){
					num2 *=10; num2+=(s[i] -'0');
					i++;
				}
				i--;
				int num = S1.top() / num2;
				S1.pop(); S1.push(num);
			}
			else{
				S2.push('/');
			}
		}
		else if(s[i] == '+'){
			//in++;
			if(V[in+1] != '*' && V[in+1] != '/' && V[in+1] != '('){
                num2 = 0;
                i++;
				while( s[i]>='0' && s[i]<='9' ){
					num2 *=10; num2+=(s[i] -'0');
					i++;
				}
                i--;
				int num = S1.top() + num2;
				S1.pop(); S1.push(num);
			}
			else{
				S2.push('+');
			}
		}
		else if(s[i] == '-'){
			//in++;
			if(V[in+1] != '*' && V[in+1] != '/' && V[in+1] != '('){
                num2 = 0;
                i++;
				while( s[i]>='0' && s[i]<='9' ){
					num2 *=10; num2+=(s[i] -'0');
					i++;
				}
                i--;
				int num = S1.top() - num2;
				S1.pop(); S1.push(num);
			}
			else{
				S2.push('-');
			}
		}
		else if(s[i] == ')'){
			//in++;
			while(S2.top() != '('){
				if(S2.top() == '+'){
					int num = S1.top();
					S1.pop(); num+= S1.top(); S1.pop(); S1.push(num);
				}
				else if(S2.top() == '-'){
					int num = S1.top();
					S1.pop(); num = S1.top() - num; S1.pop(); S1.push(num);
				}
				S2.pop();
			}
			S2.pop();
			if(!S2.empty() && S2.top() =='*'){

				int num = S1.top();
				S1.pop(); num *=S2.top(); S2.pop(); S2.push(num);
				S2.pop();
			}
			else if(!S2.empty() && S2.top() =='/'){
				int num = S1.top();
				S1.pop(); num =S2.top() /num; S2.pop(); S2.push(num);
				S2.pop();
			}
		}
		//cout << s[i] << ":\n";
        //Out( S1 );
        //Out( S2 );
	}
	while( !S2.empty()){
		if(S2.top() == '+'){
			int num = S1.top();
			S1.pop(); num+= S1.top(); S1.pop(); S1.push(num);
			}
		else if(S2.top() == '-'){
			int num = S1.top();
			S1.pop(); num = S1.top() - num; S1.pop(); S1.push(num);
			}
		S2.pop();
	}
	fout << S1.top() ;
	return 0;
}