Ir ao conteúdo
  • Cadastre-se
Igor Vargas

C Pilha com vetores em c

Recommended Posts

Estou com uma dúvida. O meu programa não esta retirando o topo na função pop, ele esta tirando só o numero do inicio e também na hora de exibir ele esta mostrando os numeros que foram retirados.

 

#include <stdio.h>
#include <stdlib.h>
#define MAX 10

int pilha[MAX];
int inicio,fim;

int pilhaCheia(){
	return (fim == MAX); 	// caso o final for igual a 10 esta cheia
}
int pilhaVazia(){
	return (inicio == fim); 	// verifica se esta vazio e retorna;
}
void push(int x){
	if( !pilhaCheia() ){
		pilha[fim++] = x;	//adiciona o valor e soma +1 posiçao
	}else{
	printf("Pilha cheia \n");	
	}
}
int pop(){
	int aux;
	if( !pilhaVazia() ){
		aux=pilha[fim - 1];		//volta uma posiçao e passa o numero e entao decrementa
		fim--;
		return aux;
		
		}else{
			printf("Pilha vazia \n");
		return -1;	
		}
	}
	

void exibe(int pilha[MAX]){
	int x;
	for( x=0; x < MAX; x++){
		printf("%d",pilha[x]);	//exibe o vetor;
	}
}

main(){
	
	inicio = 0;
	fim = 0;
	int escolha,valor;
	do{
	printf("\n1 EMPILHA:\n");
	printf("\n2 DESEMPILHA:\n");
	printf("\n3 Mostra:\n");
	printf("\n4 Sair:\n");
	scanf("%d",&escolha);
	int x;
	switch(escolha){
		case 1:
			printf("Escolha o valor:");
			scanf("%d",&valor);
			push(valor);
			break;
			case 2:
			pop();
			printf("%d",pop());
			break;
			case 3:
			for(x = 0 ; x < MAX ; x++){
				printf("%d",pilha[x]);
			}	
			break;
			default:
			break;
	}
	
	

	}while( escolha != 4);	
	
	
}

 

  • Curtir 2
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Igor Vargas Olá. Ótimo seu código!

Apenas para resolver os erros q você diz estar dando:

Na função exibe seria isso:

void exibe(int pilha[MAX]) {
    int x;
    for( x = inicio; x < fim; x++) {
        printf("%d ", pilha[x]);	//exibe o vetor;
    }
    printf("\n");
}

E aí para remover um item da pilha e exibir os elementos, poderia deixar o seu switch dessa forma:

do {
    printf("\n1 EMPILHA:\n");
    printf("\n2 DESEMPILHA:\n");
    printf("\n3 Mostra:\n");
    printf("\n4 Sair:\n");
    scanf("%d",&escolha);

    switch(escolha) {

    case 1:
        printf("Escolha o valor: ");
        scanf("%d", &valor);
        push(valor);
        break;
    case 2:
        if (!pilhaVazia()) {
            printf("Elemento removido: %d\n", pop());
        } else {
            printf("\nA pilha esta vazia!\n");
        }
        break;
    case 3:
        if (!pilhaVazia()) { // se a pilha não está vazia
            printf("Elementos: ");
            exibe(pilha); // aqui usa a função exibe para mostrar os elementos
        } else {
            printf("\nA pilha esta vazia!\n");
        }
        break;
    default:
        break;
    }
} while( escolha != 4);

Se deu p resolver ok. Pelo q testei aqui tudo ok com o restante do código :)

Obs: Apenas não estou verificando se a pilha está cheia ou não antes de solicitar para inserir um elemento, mas creio q isso você vai saber fazer.

Também uma sugestão q eu daria é de informar que a pilha está vazia na função exibe mesmo. Mas isso também fica a seu critério. É apenas uma sugestão

Também seria interessante inicializar as variáveis globais inicio e fim onde você as declarou:

int inicio = 0, fim = 0;

 

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Igor Vargas Olá. Cara, como gostei do seu código me empolguei com o negócio e, fazendo poucas alterações, o código ficou assim:

#include <stdio.h>

#define MAX 10

int pilha[MAX];
int inicio = 0, fim = 0;

// Protótipo das funções
int pilhaCheia(void);
int pilhaVazia(void);
void push(int);
int pop(void);
void exibe(int *);
void limpa_linha(void);

int pilhaCheia() {
    return (fim == MAX);
}

int pilhaVazia() {
    return (inicio == fim);
}

void push(int x) {
    pilha[fim++] = x;
}

int pop() {
    return pilha[fim-- - 1];
}

void exibe(int pilha[MAX]) {
    int x;
    if (!pilhaVazia()) {
        printf("\nElementos da estrutura: ");
        for( x = inicio; x < fim; x++) {
            printf("%d ", pilha[x]);
        }
    } else {
        printf("\nA estrutura esta vazia!");
    }
    printf("\n");
}

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

int main() {

    int escolha, valor;

    do {
        printf("\n1 EMPILHA:\n");
        printf("2 DESEMPILHA:\n");
        printf("3 MOSTRAR:\n");
        printf("4 SAIR:\n");
        printf("\nSua opcao: ");
        scanf("%d", &escolha);
        limpa_linha();

        switch(escolha) {

        case 1:
            if (!pilhaCheia()) {
                printf("\nEscolha o valor: ");
                scanf("%d", &valor);
                limpa_linha();
                push(valor);
            } else
                printf("\nA estrutura esta cheia!\n");
            break;
        case 2:
            if (!pilhaVazia()) {
                printf("\nElemento removido: %d\n", pop());
            } else
                printf("\nA estrutura esta vazia!\n");
            break;
        case 3:
            exibe(pilha);
            break;
        case 4:
            // sair
            break;
        default:
            printf("\nOpcao invalida!\n");
            break;
        }
    } while( escolha != 4);

    return 0;
}

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá todos, tudo bem?

 

Então, com relação aos exemplares, em pilha o início é o fim e o fim é o início, ou seja, no vetor o índice zero é o fim da pilha (início da extremidade chamada topo). A ausência de elementos (ou pilha vazia) é indicado por índice -1. Seria bom colocar esses conceitos, que apresentei, em prática.

 

 

OK? Tchau! 

 

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Olá. Com respeito ao q estudei sobre a estrutura de dados pilha em C, o q poderia dizer que q a mesma segue o conceito LIFO (Last in, First out). Tal como uma pilha de pratos, por exemplo

Com as função Push (insere um elemento) e Pop (remove um elemento).

Já quanto a retornar -1 se a pilha está vazia devo dizer q não estudei nada a respeito disso e vou tratar d pesquisar sobre esse ponto.

Com relação aos conceitos q você descreveu acima daria, se não for difícil p você, mostrar um código no estilo do código criado pelo @Igor Vargas para exemplificar o uso desses conceitos? Só se não for difícil mesmo, ok?

Abraço!

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código que eu fiz no caso é estático, só podia usar vetores, era um exercicio pra fazer em aula. Mas sobre a questão de retornar a pilha vazia era só colocar um NULL ali pra dizer que esta vazia.@AnsiC @giu_d

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 minutos atrás, Igor Vargas disse:

O código que eu fiz no caso é estático, só podia usar vetores, era um exercicio pra fazer em aula. Mas sobre a questão de retornar a pilha vazia era só colocar um NULL ali pra dizer que esta vazia

Eu não faço a menor ideia de onde vocês tiram isso, porque NULL é o mesmo que 0, e zero é um dos índices do vetor. Mas se faz sentido para você vai em frente.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Igor Vargas  @AnsiC Olá. Só q agora me veio essa dúvida quanto a retornar -1 se está vazia. 

É realmente um conceito q se aplica a uma pilha?

Devo confessar q não estudei nada a respeito disso ainda. Logo, não estou descartando, d forma alguma, esse ponto :thumbsup:

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Pra mim é mais questão de acessibilidade. Se eu vejo um NULL já sei que é vazio. Se não terei que procurar aquela variavel no código pra ver se é 0 ou não.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d Os melhores códigos já coloquei olhos sim. E você o que pensa?

adicionado 0 minutos depois
3 minutos atrás, Igor Vargas disse:

Pra mim é mais questão de acessibilidade. Se eu vejo um NULL já sei que é vazio. Se não terei que procurar aquela variavel no código pra ver se é 0 ou não.

Legal!

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Em uma questão como essa eu procuro ver qual é o lado técnico da assunto. 

Já em uma breve pesquisa encontrei esse material:

https://www.ime.usp.br/~pf/algoritmos/aulas/pilha.html

Baseado nesse material e no pouco ainda q li do mesmo, mas também levando em consideração o q estudei sobre o assunto, a maneira como o @Igor Vargas implementou seu código está correta

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Vejamos!

void criapilha (void) {
   t = 0;
}

void empilha (char y) {
   pilha[t++] = y;
}

char desempilha (void) {
   return pilha[--t];
} 

int pilhavazia (void) {
   return t <= 0;
}

O primeiro elemento na pilha é o elemento do índice 0, quando empilhado o índice soube para 1, quando desempilhado o índice cai para 0, contudo o elemento 0 já não deveria está mais na pilha, pois forá desempilhado, ainda sim permanece na memória.

 

Para concerta o erro conceitual ainda o programador implementa t  <=  0 ou sejam t pode assumir valores negativos.

 
 

Porque seguramente deveria ter colocado só t  ==  0. E para a logística que a instituição procura ensina t  ==  0 é o bastante. Ainda sim temos outras implementações análogas que trate de usar t  ==  -1 ao invés de t  <=  0. Claro que não quis dizer que a USP a 5 melhor Universidade do país esteja errada, mas o fato é que esse conceito muda de lugar para lugar, assim como as linguagens humanas o C tem suas gírias e isso não tem nada ver com normas ou lado técnico, tem tudo aver com criatividade.

 

 

Ok? Tchau! 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×