/*
Implementação de pilha
Autor: Benjamin Grando Moreira
*/

#include <iostream>
#define tamanho 5
using namespace std;

//define a estrutura que será a pilha
//a estrutura armazena a indicação do topo da pilha e um vetor com os itens (valores) da pilha
typedef struct{
      int topo = 0;
      int item [tamanho] ;
} PILHA;

//retorna se a pilha está vazia ou não
bool pilhaVazia(PILHA p){
    if(p.topo == 0) {
        return true;
    } else {
        return false;
    }
}

//retorna se a pilha está cheia ou não
bool pilhaCheia(PILHA p) {
	int tam = sizeof(p.item)/sizeof(int); //determina o tamanho do vetor
	
    if (p.topo < tam) {
        return false;
    } else {
        return true;
    }
}

//adiciona valor na pilha
void empilha(PILHA &p, int x){
    p.item[p.topo++]=x;
}

//remove valor da pilha
int desempilha(PILHA &p){
    return (p.item[--p.topo]) ;
}

//mostra os valores armazenados na pilha
void mostraPilha(PILHA p) {
	cout << "Valores da pilha: ";
	for (int i = 0; i < p.topo; i++) {
		cout << p.item[i] << " ";
	}
	cout << "\n";
}


//Código para testar a implementação.
int main(){
    PILHA s; //criar a pilha
    
    //Verificar que a pilha está vazia
    if(pilhaVazia(s)) {
        cout<<"A pilha está vazia."<<endl;
    } else {
        cout<<"A pilha não está vazia."<<endl;
    }
    
    //Empilha valor e verifica se a pilha está vazia
    empilha(s,10);
    if(pilhaVazia(s)) {
        cout<<"A pilha está vazia."<<endl;
    } else {
        cout<<"A pilha não está vazia."<<endl;
    }
    
    //Empilhar 3 elementos
    empilha(s,20);
    empilha(s,30);
    empilha(s,40);

	//Mostra os valores da pilha
    mostraPilha(s);
    
    //Verifica que a pilha está cheia
    if(pilhaCheia(s)) {
        cout<<"A pilha está cheia."<<endl;
    } else {
        cout<<"A pilha não está cheia."<<endl;
    }
    
    //Empilha valor e verifica se a pilha está cheia
    empilha(s,50);
    mostraPilha(s);
    if(pilhaCheia(s)) {
        cout<<"A pilha está cheia."<<endl;
    } else {
        cout<<"A pilha não está cheia."<<endl;
    }
    
    //Desempilha e mostrar o valor desempilhado
    cout<<"Valor desempilhado: "<< desempilha(s) <<endl;

	mostraPilha(s);
	
    return 0;
}