Untitled

mail@pastecode.io avatar
unknown
c_cpp
a year ago
3.6 kB
9
Indexable
//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;
}