Está en la página 1de 4

E.T.S.I.

Telecomunicaci
on. Lab. Prog. 2

Calculadora Postfija

Calculadora Postfija
Laboratorio de Programacion 2
(1o de Ingeniera de Telecomunicaci
on)

UNIVERSIDAD DE MALAGA

E.T.S.I. TELECOMUNICACION

Calculadora Postfija
Se pretende implementar una calculadora de n
umeros reales en notaci
on postfija. Para ello, el usuario dispone
de una pila donde almacenar los operandos y los resultados de las operaciones parciales, conforme estas se realizan.
Adem
as, el usuario debe disponer de una serie de memorias de los resultados, donde podr
a almacenar, en cada
momento, el contenido de la cabeza de la pila de operandos. El n
umero de memorias almacenadas puede ir variando
a lo largo de la ejecuci
on de la calculadora. Se trata de que el usuario pueda introducir por teclado una serie de
comandos que le permitan operar con la calculadora y las memorias. B
asicamente, estos comandos seran:
num <numero>, que permite intruducir un operando en la pila,
opr <operador>, que permite realizar la operaci
on binaria indicada en <operador> con los operandos almacenados en la pila, desapil
andolos y apilando en su lugar el resultado de la operaci
on; las operaciones
disponibles deben ser: sumar (+), restar (-), multiplicar (*) y dividir n
umeros reales (/),
ver, que permite sacar por pantalla el contenido de la cabeza de la pila de operandos,
eli, que permite eliminar (desapilar) la cabeza de la pila de operandos,
mem <memoria>, que permite almacenar en la memoria indicada (un n
umero > 0) el contenido de la cabeza
de la pila de operandos,
del <memoria>, que permite borrar la memoria indicada,
loa <memoria>, que permite apilar la memoria indicada en la pila de operandos,
fin, que permite finalizar la operaci
on con la calculadora.
Para la realizaci
on de la pr
actica deben usarse las clases Pila y Lista Posicional que se han explicado en la
asignatura de Programaci
on Modular. La clase Pila nos permitir
a almacenar operandos y resultados parciales de
operaciones, as como la consulta de los resultados de las mismas. Por otra parte, la clase Lista Posicional nos
servir
a para el almacenamiento de las memorias, tantas como el usuario disponga, que deber
an poderse insertar,
consultar y eliminar en cualquier posici
on de la lista posicional.

La clase Pila
La clase Pila nos servir
a para el almacenamiento y la consulta de operandos y resultados parciales de las
operaciones. Su especificaci
on ser
a la siguiente:

#ifndef CPILA_H
#define CPILA_H
class CPila{
public:
typedef double TElem;
// Constructor
CPila();
// Destructor
~CPila();
// Apila un elemento por la cabeza

E.T.S.I. Telecomunicaci
on. Lab. Prog. 2

Calculadora Postfija

void Apilar(const TElem elem);


// Desapila un elemento por la cabeza
void Desapilar();
// Comprueba si hay elementos en la pila
bool EstaVacia() const;
// Devuelve el valor almacenado en la cabeza
TElem Valor() const;
private:
struct Nodo{
TElem elem;
Nodo *sig;
};
Nodo *cabeza;
};
#endif
Implementaci
on:
1.

Mediante una lista enlazada con punteros.

2.

Opcionalmente, mediante la STL1 vector, para lo cual:


deber
a incluirse la librera vector, mediante la directiva #include <vector>,
la declaraci
on de la estructura de datos de la pila de operandos debe hacerse mediante la instrucci
on
vector <TElem>pila, con lo que se dispone de una estructura de datos que se comporta como una pila
de n
umeros reales (justo lo que necesitamos) y para la que disponemos de las siguientes operaciones
(siendo elem de tipo TElem y vacia de tipo bool):

pila.push back(elem): apila elem en la pila,


pila.pop back(): desapila el elemento de la cabeza de la pila,
elem = pila.back(): devuelve el valor del elemento almacenado en la cabeza de la pila,
vacia = pila.empty(): indica si la pila est
a vaca.

La clase Lista Posicional


La clase Lista Posicional servir
a para el almacenamiento (y su posterior consulta o eliminaci
on) de memorias
de los datos almacenados en la cabeza de la pila de operandos. Las operaciones b
asicas que nos permite esta clase
(cuya especificaci
on m
as exacta puede consultarse en los apuntes de la asignatura de Programaci
on Modular) se
reflejan en la definici
on siguiente:

#ifndef CLISTAPOS_H
#define CLISTAPOS_H
class CListaPos{
public:
typedef double TElem;
// Constructor
CListaPos();
1 Standard

Template Library

E.T.S.I. Telecomunicaci
on. Lab. Prog. 2

Calculadora Postfija

// Destructor
~CListaPos();
// Inserta un elemento en una posicion determinada
void Insertar(const unsigned int pos, const TElem elem);
// Elimina un elemento de una posicion determinada
void Eliminar(const unsigned int pos);
// Devuelve el elemento almacenado en una posicion determinada
TElem Consultar(const unsigned int pos) const;
// Devuelve la longitud de la lista
unsigned int Longitud() const;
private:
struct Nodo{
TElem elem;
Nodo *sig;
Nodo *ant;
};
Nodo *cabeza; // Lista doblemente enlazada
};
#endif
Implementaci
on:
1.

Mediante una lista enlazada con punteros.

2.

Opcionalmente, se propone una implementaci


on alternativa de esta clase mediante una lista doblemente
enlazada con punteros. En este tipo de listas cada nodo contiene un puntero que apunta al siguiente nodo
de la lista y, adem
as, un segundo puntero que apunta al nodo anterior; a su vez, el primer elemento de la
lista doblemente enlazada tiene como elemento anterior al u
ltimo elemento de la lista, mientras que el u
ltimo
elemento de la lista tiene como nodo siguiente al primer elemento de la lista. La implementaci
on del TAD
Lista Posicional mediante una lista doblemente enlazada con punteros permite simplificar las operaciones
de inserci
on y eliminaci
on de una determinada posici
on de la lista. En la figura 1 se representa gr
aficamente
un ejemplo de este tipo de listas.
En los apuntes del tema 2 de la asignatura de Laboratorio de Progamaci
on II puede encontrarse una explicaci
on m
as exhaustiva de las listas doblemente enlazadas. En las figuras 2 y 3 se representan gr
aficamente
las operaciones de inserci
on y eliminaci
on de nodos en en este tipo de listas, respectivamente.

Figura 1: Lista doblemente enlazada con punteros

E.T.S.I. Telecomunicaci
on. Lab. Prog. 2

Calculadora Postfija

Figura 2: Inserci
on de un nodo en una lista doblemente enlazada con punteros

Figura 3: Eliminaci
on de un nodo en una lista doblemente enlazada con punteros