Commit 83e791e6 by Alan de Oliveira

Comentários Completos

parent 5769c424
...@@ -11,6 +11,7 @@ template <class T, class Container=container<T>> ...@@ -11,6 +11,7 @@ template <class T, class Container=container<T>>
class Fila { class Fila {
public: public:
void enfilera(T elem) { void enfilera(T elem) {
N++;
auto cont = new container<T>(); auto cont = new container<T>();
cont->elemento = elem; cont->elemento = elem;
...@@ -26,6 +27,7 @@ class Fila { ...@@ -26,6 +27,7 @@ class Fila {
T desenfilera() { T desenfilera() {
if (inicio != nullptr) { if (inicio != nullptr) {
N--;
T elemento = inicio->elemento; T elemento = inicio->elemento;
Container *i = inicio; Container *i = inicio;
inicio = inicio->proximo; inicio = inicio->proximo;
...@@ -45,7 +47,14 @@ class Fila { ...@@ -45,7 +47,14 @@ class Fila {
return -1; return -1;
} }
int tamanho() {
return N;
}
private: private:
int N = 0;
Container *inicio = nullptr; Container *inicio = nullptr;
Container *fim = nullptr; Container *fim = nullptr;
...@@ -75,6 +84,10 @@ class Pilha { ...@@ -75,6 +84,10 @@ class Pilha {
else else
return -1; return -1;
} }
int tamanho() {
return N;
}
private: private:
static const int MAX = 900; static const int MAX = 900;
int N = 0; int N = 0;
...@@ -82,44 +95,65 @@ class Pilha { ...@@ -82,44 +95,65 @@ class Pilha {
}; };
template <class T> Fila<T> inverterFila(Fila<T> fila) { /**
* @brief
Fila<T> filaAux, filaInvertida; * Para inverter uma fila utilizando duas filas:
* A idéia é percorrer toda a fila e pegando apenas o último elemento, e repetindo até finalizar
* 1º Passo: Enfilero os itens em uma fila auxiliar, salvando o último elemento
* 2° Passo: Enfilero o último elemento numa segunda fila auxiliar (essa fila que vai armazenar a fila invertida)
* 3° Passo: Volto para a fila original todos os ítens, exceto o último elemento
* 4º Passo: Verifico se chegou ao fim, se não chegou repito os passos
*
* @tparam T
* @param fila
*/
template <class T> void inverterFila(Fila<T> *fila) {
Fila<T> filaAux, filaAux2;
T ultimo; T ultimo;
bool fim = false; bool fim = false;
while (!fim) { while (!fim) {
while (fila.frente() != -1) { while (fila->frente() != -1) {
ultimo = fila.frente(); ultimo = fila->frente();
filaAux.enfilera(fila.desenfilera()); filaAux.enfilera(fila->desenfilera());
} }
filaInvertida.enfilera(ultimo); filaAux2.enfilera(ultimo);
while (filaAux.frente() != -1 && filaAux.frente() != ultimo) { while (filaAux.frente() != -1 && filaAux.frente() != ultimo) {
fila.enfilera(filaAux.desenfilera()); fila->enfilera(filaAux.desenfilera());
} }
filaAux.desenfilera(); filaAux.desenfilera();
if (fila.frente() == -1) if (fila->frente() == -1)
fim = true; fim = true;
} }
return filaInvertida; while (filaAux2.frente() != -1) {
fila->enfilera(filaAux2.desenfilera());
}
} }
template <class T> Pilha<T> inverterFilaComPilha(Fila<T> fila) { /**
* @brief Inverter uma fila utilizando uma pilha.
*
* Simplesmente quando empilhamos os elementos da fila, e quandos desempilhamos, enfileirando
* na fila, automaticamente os elementos estarão invertidos.
*
* @tparam T
* @param fila
*/
template <class T> void inverterFilaComPilha(Fila<T> *fila) {
Pilha<T> pilha; Pilha<T> pilha;
while (fila.frente() != -1) { while (fila->frente() != -1) {
pilha.empilha(fila.desenfilera()); pilha.empilha(fila->desenfilera());
}
while (pilha.topo() != -1) {
fila->enfilera(pilha.desempilha());
} }
//printarPilha(pilha, "Fila invertida com Pilha");
return pilha;
} }
...@@ -181,12 +215,12 @@ int main(int argc, char* argv[]) { ...@@ -181,12 +215,12 @@ int main(int argc, char* argv[]) {
preencherFila(fila); preencherFila(fila);
fila = inverterFila(fila); inverterFila(&fila);
printarFila(fila, "Fila invertida com outra fila ???"); printarFila(fila, "Fila invertida com duas filas");
preencherFila(fila); preencherFila(fila);
Pilha<char> pilha = inverterFilaComPilha(fila); inverterFilaComPilha(&fila);
printarPilha(pilha, "Fila invertida com Pilha"); printarFila(fila, "Fila invertida com Pilha");
......
...@@ -31,6 +31,26 @@ class Pilha { ...@@ -31,6 +31,26 @@ class Pilha {
}; };
/**
* @brief
* Para fazer o algorítimo da Pilha Min
* é necessário mantermos duas pilas, uma pilha onde armazenamos os elementos
* e outra pilha onde armazenamos os elementos na ordem mínima.
*
* Para fazermos isso, precisamos verificar a cada inserção na pilha se o elemento
* que está sendo inserido é menor do que o que já está no topo da pilha mínima.
* Se o elemento for menor, inserimos ele na pilha mínima
* caso o elemento for maior, inserimos novamente o topo da pilha mínima nela mesma
*
* dessa forma a quantidade de ítens ficam sincronizados, e mantemos sempre o último
* elemento mínimo atualizado.
*
* para assegurar que o elemento esteja sincronizado, quando removemos algum íten
* da pilha principal, devemos também remover o topo da pilha mínima.
*
* @tparam T
*/
template <class T> template <class T>
class PilhaMin { class PilhaMin {
......
...@@ -93,10 +93,18 @@ bool operador(char s) { ...@@ -93,10 +93,18 @@ bool operador(char s) {
if (o == s) if (o == s)
return true; return true;
} }
return false; return false;
} }
/**
* @brief Para fazer uma conversão de expressão para polonesa reversa.
* Devemos percorrer os caracteres da expressão verificando:
* Caso: Se o caracter for um número, adicionamos ele em uma fila
* Caso: Se o caracter for um operador, adicionamos em uma pilha
* Caso: Se o caractere for um ')', desempilhamos os operadores enfileirando na fila da expressão
*
* @param expr
* @return string
*/
string polonisar(string expr) { string polonisar(string expr) {
auto stream = stringstream{expr}; auto stream = stringstream{expr};
...@@ -117,13 +125,15 @@ string polonisar(string expr) { ...@@ -117,13 +125,15 @@ string polonisar(string expr) {
else else
fila_retorno.enfilera(aux); fila_retorno.enfilera(aux);
} }
while (operadores.topo() != -1){
fila_retorno.enfilera(operadores.desempilha());
}
string exp_retorno; string exp_retorno;
while (fila_retorno.frente() != -1) { while (fila_retorno.frente() != -1) {
exp_retorno += fila_retorno.desenfilera(); exp_retorno += fila_retorno.desenfilera();
} }
return exp_retorno; return exp_retorno;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment