Ir ao conteúdo
  • Cadastre-se
Igor Vargas

C Pilha com vetores em c

Posts recomendados

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);	
	
	
}

 

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;

 

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;
}

 

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! 

 

 

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!

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

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.

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:

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!

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! 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Junte-se à conversa

Você pode postar agora e cadastrar-se depois. Se você tem uma conta, faça o login para postar.

Visitante
Responder

×   Você colou conteúdo com formatação.   Restore formatting

  Só é possível ter até 75 emoticons.

×   O link foi automaticamente convertido para mostrar o conteúdo.   Clique aqui para mostrá-lo como link comum

×   Seu texto anterior foi restaurado.   Limpar o editor

×   You cannot paste images directly. Upload or insert images from URL.






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

×
×
  • Criar novo...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!