Stack even and stack odd logic error

0

I have this code below, it works, but it's strange, it does not print the last position.

#include <stdio.h>
#include <stdlib.h>

#define TAM_PILHA 2
#define NUM_ENTRA 5

void empilha(int *pilha, int *topo, int valor)
{
if (*topo < TAM_PILHA)
{
    pilha[*topo] = valor;
    (*topo)++;
}
else
{
    printf("Pilha Cheia\n");
}
}

int desempilha(int *pilha, int *topo)
{
if (*topo > 0)
{
    (*topo)--;
    return pilha[*topo];
}
else
{
    printf("Pilha Vazia\n");
}
}

int main()
{
int pilha_par[TAM_PILHA], pilha_impar[TAM_PILHA], topo_par = 0, topo_impar = 0;
int i = 0, num_do_usuario = 0;
for (i = 0; i < NUM_ENTRA; i++)
{
    printf("\nEntre com um numero: ");
    scanf("%d", &num_do_usuario);

    if ((num_do_usuario % 2) == 0)
    {
        empilha(pilha_par, &topo_par, num_do_usuario);
    }
    else
    {
        empilha(pilha_impar, &topo_impar, num_do_usuario);
    }
}

printf("\n\nNumeros pares sao: ");
while (topo_par > 0)
{
    printf("%d ", desempilha(pilha_par, &topo_par));
}

printf("\n\nNumeros impares sao: ");
while (topo_impar > 0)
{
    printf("%d ", desempilha(pilha_impar, &topo_impar));
}

printf("\n\n");

system("pause");
return 0;
}
    
asked by anonymous 14.03.2017 / 12:17

2 answers

1

In your function empilha I changed the sign from < to <= within for (i = 0; i < NUM_ENTRA; i++) .

Entry:

Entre com um numero: 1 
Entre com um numero: 2 
Entre com um numero: 3
Entre com um numero: 4 
Entre com um numero: 5

Output:

  

Even numbers are: 4 2

     

Odd numbers are: 5 3 1

#include <stdio.h>
#include <stdlib.h>

#define TAM_PILHA 2
#define NUM_ENTRA 5

void empilha(int *pilha, int *topo, int valor)
{
    if (*topo <= TAM_PILHA)
    {
        pilha[*topo] = valor;
        (*topo)++;
    }
    else
    {
        printf("Pilha Cheia\n");
    }
}

int desempilha(int *pilha, int *topo)
{
    if (*topo > 0)
    {
        (*topo)--;
        return pilha[*topo];
    }
    else
    {
        printf("Pilha Vazia\n");
    }
}

int main()
{
    int pilha_par[TAM_PILHA], pilha_impar[TAM_PILHA], topo_par = 0, topo_impar = 0;
    int i = 0, num_do_usuario = 0;
    for (i = 0; i < NUM_ENTRA; i++)
    {
        printf("\nEntre com um numero: ");
        scanf("%d", &num_do_usuario);

        if ((num_do_usuario % 2) == 0)
        {
            empilha(pilha_par, &topo_par, num_do_usuario);
        }
        else
        {
            empilha(pilha_impar, &topo_impar, num_do_usuario);
        }

    }

    printf("\n\nNumeros pares sao: ");
    while (topo_par > 0)
    {
        printf("%d ", desempilha(pilha_par, &topo_par));
    }

    printf("\n\nNumeros impares sao: ");
    while (topo_impar > 0)
    {
        printf("%d ", desempilha(pilha_impar, &topo_impar));
    }

    printf("\n\n");


    return 0;
}

See the Ideone .

    
14.03.2017 / 13:32
2

There's nothing wrong with the code. I put some printf() to show what's happening.

The battery is really full. Put 1 item in odd, then put 1 in pair, then put a second in pair, so the 2 elements that the stack may have already been hit, then try to put the third and give full stack, then put another value on the odd stack filling -a and shut it down. Everything within normalcy. If you want to put 3 pairs and do not fill the stack, increase its size to 3. Or try just putting 2 elements in each stack.

#include <stdio.h>
#include <stdlib.h>

#define TAM_PILHA 2
#define NUM_ENTRA 5

void empilha(int *pilha, int *topo, int valor) {
    printf("%d na posição %d ", valor, *topo);
    if (*topo < TAM_PILHA) {
        pilha[*topo] = valor;
        (*topo)++;
    } else {
        printf("Pilha Cheia\n");
    }
}

int desempilha(int *pilha, int *topo) {
    if (*topo > 0) {
        (*topo)--;
        return pilha[*topo];
    } else {
        printf("Pilha Vazia\n");
        return -1;
    }
}

int main() {
    int pilha_par[TAM_PILHA] = { 0 }, pilha_impar[TAM_PILHA] = { 0 }, topo_par = 0, topo_impar = 0;
    for (int i = 0; i < NUM_ENTRA; i++) {
        int num_do_usuario = 0;
        printf("\nEntre com um numero: ");
        scanf("%d", &num_do_usuario);
        if (num_do_usuario % 2 == 0) {
            printf("Vai entrar na pilha   par: ");
            empilha(pilha_par, &topo_par, num_do_usuario);
        } else {
            printf("Vai entrar na pilha impar: ");
            empilha(pilha_impar, &topo_impar, num_do_usuario);
        }
    }
    printf("\n\nNumeros pares sao: ");
    while (topo_par > 0) {
        printf("%d ", desempilha(pilha_par, &topo_par));
    }
    printf("\n\nNumeros impares sao: ");
    while (topo_impar > 0) {
        printf("%d ", desempilha(pilha_impar, &topo_impar));
    }
}

See running on ideone . And at Coding Ground . Also put it on GitHub for future reference .

    
14.03.2017 / 15:43