//ATIVIDADE IMPLEMENTACAO TAD EM PILHAS E FILAS ESTATICAS E DINAMICAS
// 29/10/2023
//Grupo:
//Itallo Lobo Leite Carneiro RA:23003277
//Pedro Fernandes Aguiar RA:2023009216
//Joao Henrique de Menezes Pereira Santos RA:2023002313
//Allyson Fernandes de Oliveira RA:2023003787
#include <iostream>
#define N 10
using namespace std;
class No {
int chave;
No* prox;
public:
void setChave(int _chave) { chave = _chave; }
int getChave() { return chave; }
void setProx(No* _prox) { prox = _prox; }
No* getProx() { return prox; }
};
class PilhaEstatica {
int topo = -1, vet[N];
public:
void empilha(int x);
int desempilha();
int tamanho();
bool vazia() { return topo == -1; }
bool cheia() { return topo == N - 1; }
};
void PilhaEstatica::empilha(int x) {
if (!cheia()) vet[++topo] = x;
}
int PilhaEstatica::desempilha() {
return vazia() ? -1 : vet[topo--];
}
int PilhaEstatica::tamanho() {
return topo + 1;
}
class PilhaDinamica {
public:
No* topo = NULL;
void empilha(int _chave);
int desempilha();
int tamanho();
bool vazia() { return topo == NULL; }
~PilhaDinamica();
};
void PilhaDinamica::empilha(int _chave) {
No* novo_no = new No();
novo_no->setChave(_chave);
novo_no->setProx(topo);
topo = novo_no;
}
int PilhaDinamica::desempilha() {
if (vazia()) return -1;
int chave = topo->getChave();
No* aux = topo;
topo = topo->getProx();
delete aux;
return chave;
}
int PilhaDinamica::tamanho() {
int tamanho = 0;
for (No* aux = topo; aux != NULL; aux = aux->getProx()) tamanho++;
return tamanho;
}
PilhaDinamica::~PilhaDinamica() { while (!vazia()) desempilha(); }
class FilaEstatica {
private:
int inicio = -1, fim = -1, vet[N];
public:
void enfileira(int chave);
int Desenfileira();
bool Vazia() { return inicio == -1; }
};
void FilaEstatica::enfileira(int chave) {
if ((fim + 1) % N != inicio) {
fim = (fim + 1) % N;
vet[fim] = chave;
if (inicio == -1) inicio = 0;
}
}
int FilaEstatica::Desenfileira() {
if (Vazia()) return -1;
int chave = vet[inicio];
inicio == fim ? inicio = fim = -1 : inicio = (inicio + 1) % N;
return chave;
}
class FilaDinamica {
private:
No* inicio = NULL, * fim = NULL;
public:
void enfileira(int x);
int desenfileira();
bool vazia() { return !inicio; };
};
void FilaDinamica::enfileira(int x) {
No* aux = new No();
aux->setChave(x);
if (!fim) inicio = fim = aux;
else {
fim->setProx(aux);
fim = aux;
}
}
int FilaDinamica::desenfileira() {
if (!inicio) return -1;
int item = inicio->getChave();
No* aux = inicio;
inicio = inicio->getProx();
if (!inicio) fim = NULL;
delete aux;
return item;
}
int main() {
PilhaEstatica p;
for (int i = 1; i <= 5; i++) p.empilha(i);
while (!p.vazia()) cout << p.desempilha() << "\n";
PilhaDinamica* pilha = new PilhaDinamica();
for (int i = 1; i <= 5; i++) pilha->empilha(i);
delete pilha;
FilaEstatica f;
for (int i = 1; i <= 5; i++) f.enfileira(i);
for (int i = 0; i < 5; i++) cout << f.Desenfileira() << endl;
FilaDinamica* minhaFila = new FilaDinamica();
for (int i = 0; i < 5; i++) minhaFila->enfileira(i);
minhaFila->desenfileira();
while (!minhaFila->vazia()) cout << minhaFila->desenfileira() << endl;
delete minhaFila;
}