#include <iostream>
#include <cstdlib>
#include <cmath>

#include "Poli.hpp"

class Pila {
	private:
		int max;
		int tope;
		Poli *p[];

	public:
		Pila(int m);			// m es el tamano maximo 
		~Pila(void);
		void mete(const Poli&);		// meter un polinomio en la pila
		Poli* saca(void);			// sacar un polinomio de la pila
		int tamano(void) const; 	// tamano de la pila

		void add(void);
		void sub(void);
		void mul(void);
		void div(void);
		void chs(void);
};

Pila::Pila(int m)
{
	max= m;
	tope= 0;
	p= new Poli*[max];

	if (p==NULL) {
		std::cerr << "No se pudo crear la pila\n";
		exit(EXIT_FAILURE);
	}
}

Pila::~Pila(void)
{
	delete [] p;
}

void Pila::mete(const Poli& q)
{
	if (tope<max) {
		p[tope]= new Poli();
		p[tope]= *q;
		++tope;
	}
	else
		std::cerr << "Se desbordo la pila\n"; 
}

Poli Pila::saca(void)
{
	Poli* q;
	if (tope>0) { 
		q= new Poli();
		*q= p[--tope];
		delete p[tope];
	 }
	else {
		std::cerr << "La pila esta vacia\n";
		q= Poli();
	}
	return *q;
}

int Pila::tamano(void) const
{
	return tope;
}

void Pila::add(void)
{
	Poli *b= saca();
	Poli *a= saca();
	Poli r= *a + *b;
	mete(r);
	std::cout << r << std::endl;
}

void Pila::sub(void)
{
	Poli *b= saca();
	Poli *a= saca();
	Poli r= *a - *b;
	mete(r);
	std::cout << r << std::endl;
}

void Pila::mul(void)
{
	Poli *b= saca();
	Poli *a= saca();
	Poli r= *a * *b;
	mete(r);
	std::cout << r << std::endl;
}

void Pila::div(void)
{
	Poli *b= saca();
	Poli *a= saca();
	Poli r= *a / *b;
	mete(r);
	std::cout << r << std::endl;
}

void Pila::chs(void)
{
	Poli *a= saca();
	Poli r= -*a;
	mete(r);
	std::cout << r << std::endl;
}

int main(int argc, const char *argv[])
{
	Pila r(10);
	int ch;
	Poli x;
	while (true) {
		std::cout << "# ";
		std::cin >> std::ws;
		ch= std::cin.get();
		switch (ch) {
			case '+':
			case '-':
			case '0':
			case '1':
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9': std::cin.putback(ch);
					  std::cin >> x;
					  r.mete(x);
					  break;
			case 'a': r.add();
					  break;
			case 's': r.sub();
					  break;
			case 'm': r.mul();
					  break;
			case 'd': r.div();
					  break;
			case '_': r.chs();
					  break;
			case 'Q':
			case 'q': return EXIT_SUCCESS; 
			}
	}
	return EXIT_SUCCESS;
}
