Commit 5820bb18 by Alan de Oliveira

Comentando exercício 4

parent 6a0fe149
#include <iostream>
template <class D> class container {
public:
container *proximo;
......@@ -75,6 +76,10 @@ class Pilha {
else
return -1;
}
int tamanho() {
return N;
}
private:
static const int MAX = 900;
int N = 0;
......@@ -82,45 +87,88 @@ class Pilha {
};
template <class T> Pilha<T> inverterPilha(Pilha<T> pilha) {
/**
* Dado uma pilha, inverter ela utilizando uma pilha auxiliar
*
* para isso eu percorro toda a pilha
* 1° passo: Guardo o topo da pilha numa aux
* 2° passo: Desempilha o primeiro ítem da pilha
* 3° passo: Passo (todos os itens que ainda não foram trocados) da pilha para a pilha auxiliar
* 4° passo: Empilho o item salvo no aux para ficar como base da pilha.
* dessa forma, o que eu fiz foi inverter o elemento que estava
* no topo, indo para o começo.
* 5° passo: volto (todos os ítens que ainda não foram trocados) da pilhaAux para a pilha
* 6° passo: repito os passos até finalizar a troca
*
*
*/
template <class T> void inverterPilha(Pilha<T> *pilha) {
Pilha<T> pilhaAux;
while (pilha.topo() != -1) {
pilhaAux.empilha(pilha.desempilha());
int n = pilha->tamanho();
T aux;
for (int i = 0; i < n; i++) {
aux = pilha->topo();
pilha->desempilha();
for (int j=0; j < n - i -1 ; j++) {
pilhaAux.empilha(pilha->desempilha());
}
pilha->empilha(aux);
for (int j=0; j < n - i -1 ; j++) {
pilha->empilha(pilhaAux.desempilha());
}
}
return pilhaAux;
}
template <class T> Pilha<T> inverterPilhaComFila(Pilha<T> pilha) {
/**
* @brief Dada uma pilha, inverter os valores utilizando uma fila
* 1° passo: percorrer toda a pilha, desempilhando e enfileirando numa fila
* 2° passo: desinfilerar toda a fila, empilhando na pilha
*
* @tparam T
* @param pilha
*/
template <class T> void inverterPilhaComFila(Pilha<T> *pilha) {
Fila<T> filaAux;
while (pilha.topo() != -1) {
filaAux.enfilera(pilha.desempilha());
while (pilha->topo() != -1) {
filaAux.enfilera(pilha->desempilha());
}
while (filaAux.frente() != -1) {
pilha.empilha(filaAux.desenfilera());
pilha->empilha(filaAux.desenfilera());
}
return pilha;
}
template <class T> Pilha<T> inverterPilhaComDuasPilhas(Pilha<T> pilha) {
/**
* @brief dado uma pilha, inverta utilizando duas pilhas
*
* 1° Passo: passo todos os itens para uma pilha auxiliar
* 2° Passo: passo todos os iten para uma segunda pilha auxiliar
* 3° Passo: volto todos os itens para a primeira pilha
*
* Dessa forma a pilha ficará invertida
*
* @tparam T
* @param pilha
*/
template <class T> void inverterPilhaComDuasPilhas(Pilha<T> *pilha) {
Pilha<T> pilhaAux, pilhaAux2;
while (pilha.topo() != -1) {
pilhaAux.empilha(pilha.desempilha());
while (pilha->topo() != -1) {
pilhaAux.empilha(pilha->desempilha());
}
while (pilhaAux.topo() != -1) {
pilhaAux2.empilha(pilhaAux.desempilha());
}
while (pilhaAux2.topo() != -1) {
pilhaAux.empilha(pilhaAux2.desempilha());
pilha->empilha(pilhaAux2.desempilha());
}
return pilhaAux;
}
void preencherPilha(Pilha<char> &pilha) {
......@@ -171,15 +219,15 @@ int main(int argc, char* argv[]) {
preencherPilha(pilha);
pilha = inverterPilha(pilha);
inverterPilha(&pilha);
printarPilha(pilha, "Pilha invertida com pilha");
preencherPilha(pilha);
pilha = inverterPilhaComFila(pilha);
inverterPilhaComFila(&pilha);
printarPilha(pilha, "Pilha invertida com FILA");
preencherPilha(pilha);
pilha = inverterPilhaComDuasPilhas(pilha);
inverterPilhaComDuasPilhas(&pilha);
printarPilha(pilha, "Pilha invertida com duas Pilhas");
......
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