#include #include #include using namespace std; #define DEBUG 0 #define III if(DEBUG) #define LEN 500 char line[LEN]; typedef struct { char c; long long i; } el; el smerniky[500]; int prvyVolny=0; list lst; void tankList(char *line) { int a; char *p; el *elem; //tank to list a=0; p=line; while(*p) { switch(*p) { case '+': case '*': //nove CISLO -ukoncene elem = smerniky+prvyVolny; prvyVolny++; elem->i =a; elem->c =0; lst.push_back( elem ); a=0; //novy operand! elem = smerniky +prvyVolny; prvyVolny++; elem->c =*p; elem->i =-1; lst.push_back( elem ); break; default: a*=10; a+=(*p)-'0'; } p++; } //nove CISLO -ukoncene -POSLEDNE elem =smerniky+prvyVolny; prvyVolny++; elem->i =a; elem->c =0; lst.push_back( elem ); a=0; } void testList() { list::iterator it; for(it=lst.begin(); it!=lst.end(); it++) { if( (*it)->c ) printf("%c", (*it)->c); else printf("%Ld", (*it)->i); } printf("\n"); } void delList(){ lst.clear(); prvyVolny=0; } int main() { int a,b; el *elem; scanf("%s\n", line); while( *line!='E') { //writeOut III printf("%s\n",line); tankList(line); III testList(); //min list::iterator it, itD, it2; //ries 0-ly for(it=lst.begin(); it!=lst.end(); it++) { if ( ! ((*it)->c) ) //ak je CISLO if ( ! ((*it)->i) ) { //ak je 0-la //cek nalavo itD = it; if (it !=lst.begin() ) { itD --; if ((*itD)->c =='*') lst.erase( lst.begin(), it); } //cek napravo itD = it; itD ++; if ( (itD !=lst.end()) &&((*itD)->c =='*')) { lst.erase( itD, lst.end() ); } III printf("%d\n", __LINE__); III testList(); //TODO: vyraz +0+ } } //ries nasobenie for(it=lst.begin(); it!=lst.end(); it++) { if ( ! ((*it)->c) ) { //ak je CISLO //skoc na dalsi OP itD =it; itD ++; if (itD ==lst.end() ) break; //ak je * => spracuj while ( (*itD)->c == '*') { it2 =itD; it2++; (*it)->i *= (*it2)->i; lst.erase(itD); lst.erase(it2); //move to the next itD =it; itD ++; if (itD ==lst.end() ) break; III printf("%d\n", __LINE__); III testList(); } III printf("%d\n", __LINE__); III testList(); } } //ries + for(it=lst.begin(); it!=lst.end(); it++) { if ( ! ((*it)->c) ) { //ak je CISLO //skoc na dalsi OP itD =it; itD ++; if (itD ==lst.end() ) break; //ak je + => spracuj while ( (*itD)->c == '+') { it2 =itD; it2++; (*it)->i += (*it2)->i; lst.erase(itD); lst.erase(it2); //move to the next itD =it; itD ++; if (itD ==lst.end() ) break; III printf("%d\n", __LINE__); III testList(); } III printf("%d\n", __LINE__); III testList(); } } III printf("minimum: "); printf("%Ld ", (*(lst.begin()))->i ); delList(); tankList(line); III testList(); //max for(it=lst.begin(); it!=lst.end(); it++) { ///TODO if ( ! ((*it)->c) ) //ak je CISLO if ( ! ((*it)->i) ) { //ak je 0-la //cek nalavo itD = it; if (it !=lst.begin() ) { itD --; if ((*itD)->c =='*') { it2 =itD; while ((it2 !=lst.begin()) &&( (*it2)->c!='+' ) ) { it2--; } if (it2 !=lst.begin()) it2++; lst.erase( it2, it); } } //cek napravo itD = it; itD ++; if (itD !=lst.end()) { if ((*itD)->c =='*') { it2 =itD; while ((it2 !=lst.end()) &&( (*it2)->c!='+' ) ) { it2++; } lst.erase( itD, it2 ); } } III printf("%d\n", __LINE__); III testList(); //TODO: vyraz +0+ } } //ries + for(it=lst.begin(); it!=lst.end(); it++) { if ( ! ((*it)->c) ) { //ak je CISLO //skoc na dalsi OP itD =it; itD ++; if (itD ==lst.end() ) break; //ak je + => spracuj while ( (*itD)->c == '+') { it2 =itD; it2++; (*it)->i += (*it2)->i; lst.erase(itD); lst.erase(it2); //move to the next itD =it; itD ++; if (itD ==lst.end() ) break; III printf("%d\n", __LINE__); III testList(); } III printf("%d\n", __LINE__); III testList(); } } //ries nasobenie for(it=lst.begin(); it!=lst.end(); it++) { if ( ! ((*it)->c) ) { //ak je CISLO //skoc na dalsi OP itD =it; itD ++; if (itD ==lst.end() ) break; //ak je * => spracuj while ( (*itD)->c == '*') { it2 =itD; it2++; (*it)->i *= (*it2)->i; lst.erase(itD); lst.erase(it2); //move to the next itD =it; itD ++; if (itD ==lst.end() ) break; III printf("%d\n", __LINE__); III testList(); } III printf("%d\n", __LINE__); III testList(); } } III printf("maximum: "); printf("%Ld\n", (*(lst.begin()))->i ); //read next line delList(); scanf("%s\n", line); } return 0; }