Jump to content

Pilha


felipess
Go to solution Solved by user,

Recommended Posts

olá!

estou estudando pilhas em c mas não estou compreendendo muito bem.

#include <stdio.h>
    int carro[5]={0,0,0,0,0};
    int topo=0;
    
    
    void show(){
        for(int run=0; run < 5; run++){
	    printf("===");
	    printf("%d", carro[run]);
	    printf("===");
	}
	printf("\ntopo: %d\n", topo);
    
    }

    void add(){
        int pessoa;
	if(topo < 5){
	    printf("pessoa: ");
	    scanf("%d", &pessoa);
	    carro[topo] = pessoa;
	    topo = topo +1;
	}
	else{
	    printf("carro cheio\n");
	}
    
    }
    
    void del(){
        if(topo > 0){
	    carro[topo]= 0;
	    topo = topo -1;
	
	}
	else{
	    printf("carro vazio\n");
	
	}
    
    
    }

    void clear(){
        for(int run=0; run < 5; run++){
	    carro[run]=0;
	}
	topo =0;
    
    }
    
    int main(){
	int op;
        do{
	    printf("1-show, 2-add, 3-del, 4-clear, 00-exit: ");
	    scanf("%d", &op);
	    switch(op){
	        case 1:
		    show();
		break;
		case 2:
		    add();
		break;
		case 3:
		    del();
		break;
		case 4:
		    clear();
		break;

	    
	    }
	
	}while(op != 00);

	    
        return 0;
    }

meu código não deleta valor da pilha, e não consigo colocar valor do topo, apenas a quantidade.

Apenas os soldados mortos veem o fim da guerra!

Link to comment
Share on other sites

  • Solution

na tua função del(), estás a limpar o valor do próximo elemento, pois, segundo a lógica que consigo compreender do código fornecido, a variável topo contem o a contagem do proximo elemento que vais adicionar.

na tua função del(), experimenta desta maneira:

topo = topo -1;
carro[topo]= 0;


Não consigo compreender o problema de não conseguires adicionar o valor a pilha, talvez se trate de um "bug" com o scanf do C (que não é bem um bug), que quando usas o scanf mais do que uma vez, o scanf vai ler o "enter" anteriormente inserido no primeiro uso da função.
Para que isto deixe de acontecer, sempre que se utiliza o scanf, é necessário limpar o "input do teclado" (chamado de stdin buffer) para que o 'enter' nao seja lido pelo scanf.

função para limpar o buffer stdin:
 

void clearBuffer() {
	char c;
	do {
		c = getchar();
	} while (c != '\n' && c != EOF);
}


Agora, sempre que usares o scanf, chamas o clearBuffer() antes para garantir que o scanf não irá ler o 'Enter' pressionado pelo teclado do input anterior.
Exmplo:
 

clearBuffer();
scanf("%d", &pessoa);


Não te esqueças do o chamar também no menu principal antes de ler a opção
 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.