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

class Pila {
	private:
		int max;
		int tope;
		double *p;

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

		void add(void);
		void sub(void);
		void mul(void);
		void div(void);
		void pow(void);
		void chs(void);
		void sin(void);
		void cos(void);
};

Pila::Pila(int m)
{
	max= m;
	tope= 0;
	p= new double[max];
	if (p==NULL) {
		std::cerr << "No se pudo crear la pila\n";
		exit(EXIT_FAILURE);
	}
}

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

void Pila::mete(double x)
{
	if (tope<max) 
		p[tope++]= x;
	else
		std::cerr << "Se desbordo la pila\n"; 
}

double Pila::saca(void)
{
	double x;
	if (tope>0) 
		x= p[--tope];
	else {
		std::cerr << "La pila esta vacia\n";
		x= 0.0;
	}
	return x;
}

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

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

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

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

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

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

void Pila::pow(void)
{
	double a, b, r;
	b= saca();
	a= saca();
	r= std::pow(a,b);
	mete(r);
	std::cout << r << std::endl;
}

void Pila::sin(void)
{
	double a, r;
	a= saca();
	r= std::sin(a);
	mete(r);
	std::cout << r << std::endl;
}

void Pila::cos(void)
{
	double a, r;
	a= saca();
	r= std::cos(a);
	mete(r);
	std::cout << r << std::endl;
}

int main(int argc, const char *argv[])
{
	Pila r(10);
	int ch;
	double x;
	while (true) {
		std::cout << "# ";
		std::cin >> std::ws;
		ch= std::cin.get();
		switch (ch) {
			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 '+': r.add();
					  break;
			case '-': r.sub();
					  break;
			case '*': r.mul();
					  break;
			case '/': r.div();
					  break;
			case '^': r.pow();
					  break;
			case '_': r.chs();
					  break;
			case 's': r.sin();
					  break;
			case 'c': r.cos();
					  break;

			case 'Q':
			case 'q': return EXIT_SUCCESS; 
			}
	}
	return EXIT_SUCCESS;
}
