#include #include #include "stack.h" int getOperandos(Stack& pS, int* n1, int* 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 implementation - factoryMethod Stack* pS = Stack::create(Stack::STACK_LE); // Construct a Stack with VE implementation - factoryMethod // Stack* pS = Stack::create(Stack::STACK_VE); while( 1 ) { char line[31]; int i; std::cout<<"\ncalc-pol> "; std::cin>>line; if( sscanf_s(line, " %d", &i, sizeof(i))==1 ) { pS->push(i); // Empilha operando ... } else // Verifica se eh operador ... { int 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 ) }