(20 pts) Questão 1:
Implemente o código que utilize duas pilhas para armazenar os dados como se estivessem sendo armazenados em uma Fila, porém usando a estrutura de pilha para isso.
c) Faça o código de uma função que adicione um elemento na sua estrutura, e outra função que remova um elemento da sua estrutura, assuma que as funções de empilhar e desempilhar elementos na pilha já existem. Lembre-se de usar ponteiro.

Passo 1

Beleza, vamos lá! A questão pede para a gente implementar uma fila usando duas pilhas. Então, primeiro, vamos entender o que é uma fila e uma pilha. Uma fila funciona no estilo “primeiro a entrar, primeiro a sair” (FIFO), tipo quando você espera na fila do banco. Já uma pilha funciona no estilo “último a entrar, primeiro a sair” (LIFO), como uma pilha de pratos. Para resolver isso, vamos usar duas pilhas para simular o comportamento de uma fila. Vamos precisar das funções de empilhar (push) e desempilhar (pop) que já estão disponíveis.

Passo 2

Vamos começar criando a função para adicionar um elemento na nossa estrutura (enqueue). Nesse caso, vamos simplesmente empilhar o elemento na primeira pilha (stack1). Isso porque, toda vez que adicionamos, queremos que ele fique no topo da stack1.
void enqueue(Stack *stack1, int elemento) {
    push(stack1, elemento);
}

Passo 3

Agora, vamos criar a função para remover um elemento da nossa estrutura (dequeue). Aqui é onde usamos a segunda pilha (stack2). Se a stack2 estiver vazia, a gente desempilha todos os elementos da stack1 e empilha na stack2. Isso faz com que o primeiro elemento que entrou na stack1 fique no topo da stack2, pronto para ser removido. Se a stack2 já tiver elementos, é só desempilhar dela diretamente.
int dequeue(Stack *stack1, Stack *stack2) {
    if (isEmpty(stack2)) {
        while (!isEmpty(stack1)) {
            int elemento = pop(stack1);
            push(stack2, elemento);
        }
    }
    if (!isEmpty(stack2)) {
        return pop(stack2);
    } else {
        printf("Fila vazia!\n");
        return -1; // Valor de erro
    }
}

Resposta

Prontinho! Agora você tem as funções para adicionar (enqueue) e remover (dequeue) elementos usando duas pilhas para simular uma fila. Assim, mesmo usando pilhas que funcionam no estilo LIFO, conseguimos manter a ordem FIFO da fila.
// Função para adicionar um elemento na fila
void enqueue(Stack *stack1, int elemento) {
    push(stack1, elemento);
}

// Função para remover um elemento da fila
int dequeue(Stack *stack1, Stack *stack2) {
    if (isEmpty(stack2)) {
        while (!isEmpty(stack1)) {
            int elemento = pop(stack1);
            push(stack2, elemento);
        }
    }
    if (!isEmpty(stack2)) {
        return pop(stack2);
    } else {
        printf("Fila vazia!\n");
        return -1; // Valor de erro
    }
}

Exercícios relacionados