Buscar

PILHA com Lista

Prévia do material em texto

/*PILHA com Lista*/
/*pilha.h*/
#include <stdlib.h>
typedef struct elemento Elemento;
typedef struct pilha Pilha;
Pilha *pi_cria(void);
void pi_push(Pilha*pi,int novo);
int pi_pop(Pilha*pi);
void pi_libera(Pilha *pi);
int pi_eh_vazia(Pilha *p);
#include <stdio.h>
#include <stdlib.h>
#include "pilha.h"
struct elemento{
	int info;
	struct elemento *prox;
};
struct pilha
{
	Elemento *prim;/*Cria uma variavel(Nó) do tipo elemento*/
};
Pilha *pi_cria(void)
{
	Pilha *p;
	p=(Pilha*)malloc(sizeof(Pilha));/*Criando uma pilha vazia*/
	if(p==NULL)/*Não conseguiu alocar*/
		exit(1);
	p->prim=NULL;/*o ENDEREÇO do PRIMEIRO será NULL*/
	return p;/*retorno a pilha*/
}
void pi_push(Pilha *p,int v)/*insere na pilha*/
{
	Elemento *novo;
	novo=(Elemento*)malloc(sizeof(Elemento));/*Cria um novo ELEMENTO e não PILHA*/
	if(novo==NULL)/*Não conseguiu alocar*/
		exit(1);
	novo->info=v;
	novo->prox=p->prim;/*Meu prox será o endereço do primeiro*/
	p->prim=novo;/*O primeiro agora será meu endereço(NOVO)*/
}
int pi_pop(Pilha *p)
{
	Elemento *t;
	int v;
	if(pi_eh_vazia(p))/*Se for VAZIA a func vai retornar 1, e o VS interpreta como sim*/
	{
		printf("Pilha eh vazia\n");
		exit(1);
	}
	t = p->prim;/*o endereço de t é o PRIMEIRO da pilha*/
	v = t->info;/*v tem a informaçao do PRIMEIRO da pilha*/
	p->prim = t->prox;/*o PRIMEIRO vira o proximo*/
	free(t);/*APAGO o PRIMEIRO DA PILHA*/
	return v;/*retorna o valor(info) pra imprimir*/
}
void pi_libera(Pilha *p)
{
	Elemento *t, *q;
	q=p->prim;/*q guarda o endereço do PRIMEIRO da pilha*/
	while(q!=NULL)
	{
		t=q->prox;/*t guarda o endereço do meu proximo*/
		free(p);/*LIBERA CADA ELEMENTO DA PILHA*/
		q=t;/*q "vira" o proximo*/
	}
	free(p);/*LIBERA A PILHA*/
}
int pi_eh_vazia(Pilha *p)
{
	if(p->prim==NULL)
		return 1;
	return 0;
}
Implementações de Pilha:
void retiraImpares (Pilha* p)
{
	int x, resto;
	Pilha *pic;
	pic=pi_cria();
	while(!pi_eh_vazia(p))
	{
		x=pi_pop(p);
		if(x%2!=0)
		pi_push(pic,x);
	}
	while(!pi_eh_vazia(pic))
	{
		printf("%d\n", pi_pop(pic));
	}
	pi_libera(pic);
}
void concatenaPilhas (Pilha* p1 , Pilha *p2)
{
	float x;
	while(!vazia(p1))
	{
		x=pop(p1);
		push(p2,x);
	}
	while(!vazia(p2))
	{
		printf("%.2f\n", pop(p2));
	}
}

Continue navegando