(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.
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
}
}