#include<iostream>
#include<limits.h>

typedef int TipoInfo; // tipo contenuto nella pila

typedef TipoInfo* Pila; // array di elementi. Elemento in pos 0 è affiorante

bool isEmpty(Pila p, int n){
	return n == 0;
}

void push(Pila* p, int* n, TipoInfo v){
	if (p == NULL)
		return;
	*n = *n+1;
	Pila q = (Pila) malloc((*n)*sizeof(TipoInfo));
	q[0] = v;
	for(int i = 1; i < *n; i++){
		q[i] = (*p)[i-1];
	}
	free(*p);
	*p = q;
}

TipoInfo pop(Pila* p, int *n){
	if (p == NULL || isEmpty(*p,*n)){
		return INT_MIN;// valore per segnalare errore
	}
	*n = *n-1;
	Pila q = (Pila) malloc((*n)*sizeof(TipoInfo));
	for(int i = 0; i < *n; i++){
		q[i] = (*p)[i+1];
	}
	TipoInfo result = (*p)[0];
	free (*p);
	*p = q;
	return result;
}

TipoInfo top(Pila p, int n){
	if (p == NULL || isEmpty(p,n)){
		return INT_MIN;// valore per segnalare errore
	}
	return p[0];
}

// Funzioni ausiliarie

void stampa(Pila p, int n){
	if (isEmpty(p,n)){
		std::cout << std::endl;
		return;
	}
	std::cout << p[0] << " ";
	stampa(p+1,n-1);
}

int main(){
	Pila p = NULL;
	int n = 0;
	stampa(p,n); // stampa pila vuota
	for (int i = 0; i < 10; i++){
		push(&p,&n,i);
	}
	stampa(p,n); // 9 8 7 6 5 4 3 2 1 0
	std::cout << "top(&p)=" << top(p,n) << std::endl; // top(&p)=9
	stampa(p,n); // 9 8 7 6 5 4 3 2 1 0
	std::cout << "pop(&p)=" << pop(&p,&n) << std::endl;  // pop(&p,&n)=9
	stampa(p,n); // 8 7 6 5 4 3 2 1 0
}

