#include #include "stack.h" int getOperandos(Stack& pS, TPELEM* n1, TPELEM* n2) { if( pS.isEmpty() ) { std::cerr<<"Error: empty stack !!!\n"; return 0; } *n2 = pS.pop(); if( pS.isEmpty() ) { pS.push(*n2); std::cerr<<"Error: two operands needed !!!\n"; return 0; } *n1 = pS.pop(); return 1; } int main(void) { // Construct a Stack with LE-Lista Encadeada de Complex implementation - factoryMethod // Stack* pS = Stack::create(Stack::STACK_LE); // Construct a Stack with CE-Vector of Complex implementation - factoryMethod Stack* pS = Stack::create(Stack::STACK_CE); while( 1 ) { char line[31]; float re, im; std::cout<<"\ncalc-pol> "; // std::cin>>line; -> nao funciona para ler complex gets_s(line, sizeof(line)); if( sscanf_s(line, " (%f, %f)", &re, &im, sizeof(re), sizeof(im))==2 ) // Empilha Complex ... { #ifdef _stack_complex_ pS->push( TPELEM(re, im) ); #endif } else if( sscanf_s(line, " %f", &re, sizeof(re))==1 ) { // Empilha operando float ... pS->push(re); } else // Verifica se eh operador ... { TPELEM n1, n2; char operador; sscanf_s(line, "%c", &operador, sizeof(char)); switch(operador) { case '+': if ( getOperandos(*pS, &n1, &n2) ) pS->push(n1+n2); break; case '-': if ( getOperandos(*pS, &n1, &n2) ) pS->push(n1-n2); break; case '/': if ( getOperandos(*pS, &n1, &n2) ) { if( n2 != 0 ) { pS->push(n1/n2); } else { std::cout<<"Error: colud not divide by zero !!!\n"; pS->push(n1); pS->push(n2); } } break; case '*': if (getOperandos(*pS, &n1, &n2)) pS->push(n1*n2); break; case 'q': exit(0); default: std::cout<<"Error: Invalid operand or operator op=[ "<iterator(); while( ! it1->fim() ) { std::cout<<" pilha: "<prox(); } std::cout<<"\n"; std::cout<<"\nPrinting Stack-2 -----------------------------\n"; StackIterator *it2 = pS->iterator(); it2->percorre(); std::cout<<"\n"; } // Fim while( 1 ) }