Você está na página 1de 44

Melissa Nonato - Código do exercício comentado

Exercício 1: Crie uma função chamada criaPilhaque inicializa uma pilha vazia e a
retorna como um ponteiro.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");
return 0;
}

Exercício 2: Crie uma função chamada empilhaque recebe uma pilha e um valor inteiro
como parâmetros e empilha o valor na pilha.

typedef struct { // definindo uma estrutura chamada struct


int itens[MAX_TAMANHO]; // criando uma array de inteiros chamada itens
int topo; // criando uma array de inteiros chamada topo
} Pilha; // essa estrutura toda representa a pilha onde itens armazenará os
elementos da pilha e o topo indicaará a posição do elemento no topo da pilha

Pilha* criaPilha() { //função criaPilha responsável por criar e inicializar uma


pilha,aloca dinamicamente memória para a piha através do malloc e retorna um
ponteiro para a pilha que foi recém-criada
if (novaPilha == NULL) { // verifica se a alocação de memória foi bem sucedida,
se a novaPilha for NULL signfica que a alocação falho e será impressa uma mensafem
de erro seguita pela chamada de exit(1) para encerrar o programa com um código de
erro
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha)); // aqui o ponteiro novaPilha
é declarado e é alocada memória dinamicamente para uma nova instância da esutura
Pila usando malloc. A funcção sizeof(Pilha) é usada para determinar o tamanho
necessário para alocar memória para a estrutura Pilha. O ponteiro é convetido para
o tipo Pilha*
printf("Erro: Falha na alocação de memória para a pilha.\n"); // mensagem
exibida caso ocorra um erro na verificação da alocação de memória
exit(1); // encerra o programa com um código de erro caso haja falh na
alocação de memória
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia) // o campo
topo da estrutura novaPilha é inicializado com -1, o que indica que a pilha está
vazia no momento da criação
return novaPilha; // a função retorna o ponteiro para a pilha recém criada
}
void empilha(Pilha* pilha, int valor) { // a função empilha é responsável por
adicionar um valor na pilha, ela recebe um ponteiro para a pilha pilha e um valor
inteiro valor como argumentos
if (pilha->topo == MAX_TAMANHO - 1) { // verifica condicionalmente se a pilha
está cheia, a pilha está cheia quando topo é igual a MAX_TAMANHO - 1. Se a pilha
estiver cheia, uma mensagem de erro é apresentada, indicando que não é possível
empilhar o valor desejado
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n",
valor); // mensagem de erro apresentada caso a verificação condicional indicar que
a pilha está cheia
} else { // caso a pilha não esteja cheia
pilha->itens[++(pilha->topo)] = valor; // o valor valor é adicionado a
pilha, o campo topo é incrementado em 1 antes de ser usado com índica para o array
itens. Isso significa que o novo elemento será empilhado no topo da pilha
}
}

int main() {
Pilha* minhaPilha = criaPilha(); // no main é criada uma nova pilha chamada
minhaPilha, é criada chamandao a função criaPilha(). Ela aloca dinamicamente
memória para a pilha e a inicializa
printf("Pilha criada com sucesso!\n"); //é exibida a mensagem de que a pilha
foi criada com sucesso

empilha(minhaPilha, 10); // um valor de 10 é empilhado na pilha minhaPilha


empilha(minhaPilha, 20);// um valor de 20 é empilhado na pilha minhaPilha
empilha(minhaPilha, 30);// um valor de 30 é empilhado na pilha minhaPilha

// Você pode adicionar mais valores à pilha conforme necessário.


free(minhaPilha); // a memória alocada dinamicamente para a pilha minhaPilha é
liberada antes de encerrar o programa para evitar vazamentos de memoria

return 0;
}

Neste exemplo, a função empilha verifica se a pilha não está cheia (limite definido
como MAX_TAMANHO) e, se não estiver cheia, empilha o valor passado como argumento
na pilha. O código cria uma pilha, empilha alguns valores nela e, em seguida,
libera a memória da pilha antes de encerrar o programa.

Exercício 3: Crie uma função chamada desempilhaque recebe uma pilha como parâmetro
e remove o elemento do topo da pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}
void empilha(Pilha* pilha, int valor) {
if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);
int valorDesempilhado = desempilha(minhaPilha);
printf("Valor desempilhado: %d\n", valorDesempilhado);
free(minhaPilha);
return 0;
}

Exercício 4: Crie uma função chamada topoPilhaquerecebe uma pilha como parâmetro e
retorna o elemento do topo da pilha sem removê-lo.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int topoPilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não há elemento no topo.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[pilha->topo];
}
}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);

int valorTopo = topoPilha(minhaPilha);


printf("Elemento no topo da pilha: %d\n", valorTopo);
free(minhaPilha);
return 0;
}

Exercício 5: Crie uma função chamada tamanhoPilhaque recebe uma pilha como
parâmetro e retorna o número de elementos na pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}
void empilha(Pilha* pilha, int valor) {
if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}
int tamanhoPilha(Pilha* pilha) {
return pilha->topo + 1; // O tamanho é o topo + 1
}
int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);

int tamanho = tamanhoPilha(minhaPilha);


printf("Tamanho da pilha: %d\n", tamanho);
free(minhaPilha);
return 0;
}

Exercício 6: Crie uma função chamada limpaPilhaque recebe uma pilha como parâmetro
e a esvazia, removendo todos os elementos.

#include <stdlib.h>

#define MAX_TAMANHO 100

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

void limpaPilha(Pilha* pilha) {


pilha->topo = -1; // Define o topo como -1 para esvaziar a pilha
}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);

printf("Tamanho da pilha antes da limpeza: %d\n", minhaPilha->topo + 1);

limpaPilha(minhaPilha);
printf("Pilha esvaziada.\n");

printf("Tamanho da pilha após a limpeza: %d\n", minhaPilha->topo + 1);

free(minhaPilha);

return 0;
}

Exercício 7: Crie uma função chamada copiaPilhaque recebe uma pilha como parâmetro
e retorna uma cópia da pilha.
typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

Pilha* copiaPilha(Pilha* pilha) {


Pilha* novaPilha = criaPilha();

for (int i = 0; i <= pilha->topo; i++) {


empilha(novaPilha, pilha->itens[i]);
}

return novaPilha;
}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);

Pilha* copiaMinhaPilha = copiaPilha(minhaPilha);


printf("Pilha copiada.\n");

free(minhaPilha);
free(copiaMinhaPilha);

return 0;
}

Exercício 8: Crie uma função chamada invertePilhaque recebe uma pilha como
parâmetro e inverte a ordem dos elementos na pilha original.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

void invertePilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Transferir elementos da pilha original para a pilha auxiliar


while (pilha->topo != -1) {
int valor = desempilha(pilha);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos da pilha auxiliar de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha original enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}
free(pilhaAuxiliar); // Liberar a pilha auxiliar
}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

invertePilha(minhaPilha);

printf("Pilha invertida: ");


imprimirPilha(minhaPilha);
printf("\n");

free(minhaPilha);

return 0;
}

Exercício 9: Crie uma função chamada verificaPilhaVaziaque recebe uma pilha como
parâmetro e retorna verdadeiro se a pilha estiver vazia e falso caso contrário.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

bool verificaPilhaVazia(Pilha* pilha) {


return (pilha->topo == -1); // Verdadeiro se o topo for -1 (pilha vazia), falso
caso contrário
}
int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

printf("A pilha está vazia? %s\n", verificaPilhaVazia(minhaPilha) ? "Sim" :


"Não");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);

printf("A pilha está vazia? %s\n", verificaPilhaVazia(minhaPilha) ? "Sim" :


"Não");

free(minhaPilha);

return 0;
}

Exercício 10: Crie uma função chamada concatenaPilhasquerecebe duas pilhas como
parâmetros e concatena os elementos da segunda pilha no final da primeira pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

void concatenaPilhas(Pilha* pilha1, Pilha* pilha2) {


// Desempilhe os elementos da pilha2 e empilhe na pilha1
while (pilha2->topo != -1) {
int valor = desempilha(pilha2);
empilha(pilha1, valor);
}
}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* pilha1 = criaPilha();
Pilha* pilha2 = criaPilha();

empilha(pilha1, 10);
empilha(pilha1, 20);
empilha(pilha1, 30);

empilha(pilha2, 40);
empilha(pilha2, 50);
empilha(pilha2, 60);

printf("Pilha 1 antes da concatenação: ");


imprimirPilha(pilha1);
printf("\n");

printf("Pilha 2 antes da concatenação: ");


imprimirPilha(pilha2);
printf("\n");

concatenaPilhas(pilha1, pilha2);

printf("Pilha 1 após a concatenação: ");


imprimirPilha(pilha1);
printf("\n");

free(pilha1);
free(pilha2);

return 0;
}

Exercício 11: Crie uma função chamada invertePilhaSemUmaPilhaAuxiliarque recebe uma


pilha como parâmetro e inverte a ordem dos elementos na pilha original, sem usar
uma pilha auxiliar.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

void invertePilhaSemPilhaAuxiliar(Pilha* pilha) {


if (pilha->topo != -1) {
int valor = desempilha(pilha);
invertePilhaSemPilhaAuxiliar(pilha); // Chamada recursiva
insereNoFundo(pilha, valor);
}
}

// Função para inserir um elemento no fundo da pilha


void insereNoFundo(Pilha* pilha, int valor) {
if (pilha->topo == -1) {
empilha(pilha, valor);
} else {
int temp = desempilha(pilha);
insereNoFundo(pilha, valor);
empilha(pilha, temp);
}
}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}
// Transferir elementos de volta para a pilha original
while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

invertePilhaSemPilhaAuxiliar(minhaPilha);

printf("Pilha invertida: ");


imprimirPilha(minhaPilha);
printf("\n");

free(minhaPilha);

return 0;

Exercício 12: Crie uma função chamada calculaMediaPilhaque recebe uma pilha de
números inteiros como parâmetro e retorna a média dos valores na pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

float calculaMediaPilha(Pilha* pilha) {


int soma = 0;
int quantidade = 0;

// Desempilhe os elementos, calcule a soma e a quantidade


while (pilha->topo != -1) {
int valor = desempilha(pilha);
soma += valor;
quantidade++;
}

// Verifique se a pilha estava vazia


if (quantidade == 0) {
printf("A pilha está vazia. Não é possível calcular a média.\n");
return 0.0; // Ou outro valor de erro adequado
}

return (float)soma / quantidade;


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);

float media = calculaMediaPilha(minhaPilha);

printf("Média dos valores na pilha: %.2f\n", media);

free(minhaPilha);

return 0;
}

Exercício 13: Crie uma função chamada ordenaPilhaque recebe uma pilha de números
inteiros como parâmetro e a ordena em ordem crescente.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

void ordenaPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

while (pilha->topo != -1) {


int valor = desempilha(pilha);

while (pilhaAuxiliar->topo != -1 && pilhaAuxiliar->itens[pilhaAuxiliar-


>topo] > valor) {
int temp = desempilha(pilhaAuxiliar);
empilha(pilha, temp);
}

empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 30);
empilha(minhaPilha, 10);
empilha(minhaPilha, 50);
empilha(minhaPilha, 20);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

ordenaPilha(minhaPilha);

printf("Pilha ordenada em ordem crescente: ");


imprimirPilha(minhaPilha);
printf("\n");

free(minhaPilha);

return 0;
}

Exercício 14: Crie uma função chamada copiaPilhaInvertidaque recebe uma pilha como
parâmetro e retorna uma cópia invertida da pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

Pilha* copiaPilhaInvertida(Pilha* pilha) {


Pilha* copiaPilha = criaPilha();
Pilha* pilhaAuxiliar = criaPilha();

// Copia a pilha original para a pilha de cópia


while (pilha->topo != -1) {
int valor = desempilha(pilha);
empilha(copiaPilha, valor);
empilha(pilhaAuxiliar, valor);
}

// Inverte a ordem na pilha de cópia


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(copiaPilha, valor);
}

// Libera a pilha auxiliar


free(pilhaAuxiliar);

return copiaPilha;
}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

Pilha* copiaInvertida = copiaPilhaInvertida(minhaPilha);

printf("Cópia invertida da pilha original: ");


imprimirPilha(copiaInvertida);
printf("\n");

free(minhaPilha);
free(copiaInvertida);

return 0;
}

Exercício 15: Crie uma função chamada mesclaPilhasque recebe duas pilhas como
parâmetros e mescla os elementos das duas pilhas em uma terceira pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

Pilha* mesclaPilhas(Pilha* pilha1, Pilha* pilha2) {


Pilha* pilhaMesclada = criaPilha();

// Desempilhe os elementos da primeira pilha e empilhe na pilha mesclada


while (pilha1->topo != -1) {
int valor = desempilha(pilha1);
empilha(pilhaMesclada, valor);
}

// Desempilhe os elementos da segunda pilha e empilhe na pilha mesclada


while (pilha2->topo != -1) {
int valor = desempilha(pilha2);
empilha(pilhaMesclada, valor);
}

return pilhaMesclada;
}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* pilha1 = criaPilha();
Pilha* pilha2 = criaPilha();
printf("Pilhas criadas com sucesso!\n");

empilha(pilha1, 10);
empilha(pilha1, 20);
empilha(pilha1, 30);

empilha(pilha2, 40);
empilha(pilha2, 50);
empilha(pilha2, 60);

printf("Pilha 1: ");
imprimirPilha(pilha1);
printf("\n");

printf("Pilha 2: ");
imprimirPilha(pilha2);
printf("\n");

Pilha* pilhaMesclada = mesclaPilhas(pilha1, pilha2);

printf("Pilha mesclada: ");


imprimirPilha(pilhaMesclada);
printf("\n");

free(pilha1);
free(pilha2);
free(pilhaMesclada);

return 0;
}

Exercício 16: Crie uma função chamada removeElementoPilhaque recebe uma pilha e um
valor como parâmetros e remove todas as ocorrências desse valor na pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

void removeElementoPilha(Pilha* pilha, int valor) {


Pilha* pilhaAuxiliar = criaPilha();

// Desempilhe os elementos da pilha original e remova as ocorrências do valor


while (pilha->topo != -1) {
int elemento = desempilha(pilha);
if (elemento != valor) {
empilha(pilhaAuxiliar, elemento);
}
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int elemento = desempilha(pilhaAuxiliar);
empilha(pilha, elemento);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();
// Imprimir elementos da pilha enquanto os desempilha
while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);
empilha(minhaPilha, 20); // Incluindo uma segunda ocorrência de 20

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

int valorParaRemover = 20;


removeElementoPilha(minhaPilha, valorParaRemover);

printf("Pilha após a remoção de %d: ", valorParaRemover);


imprimirPilha(minhaPilha);
printf("\n");

free(minhaPilha);

return 0;
}

Exercício 17: Crie uma função chamada copiaNPrimeirosElementosque recebe uma pilha
e um número ncomo parâmetros e retorna uma cópia dos primeiros nelementos da pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}
void empilha(Pilha* pilha, int valor) {
if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

Pilha* copiaNPrimeirosElementos(Pilha* pilha, int n) {


Pilha* copiaPilha = criaPilha();

int contador = 0;

while (pilha->topo != -1 && contador < n) {


int valor = desempilha(pilha);
empilha(copiaPilha, valor);
contador++;
}

// Inverte a ordem da cópia da pilha (caso deseje manter a ordem original)


Pilha* pilhaAuxiliar = criaPilha();
while (copiaPilha->topo != -1) {
int valor = desempilha(copiaPilha);
empilha(pilhaAuxiliar, valor);
}
while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(copiaPilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar

return copiaPilha;
}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);
empilha(minhaPilha, 40);
empilha(minhaPilha, 50);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

int n = 3; // Copiar os primeiros 3 elementos


Pilha* copiaDosPrimeirosNElementos = copiaNPrimeirosElementos(minhaPilha, n);

printf("Cópia dos primeiros %d elementos: ", n);


imprimirPilha(copiaDosPrimeirosNElementos);
printf("\n");

free(minhaPilha);
free(copiaDosPrimeirosNElementos);

return 0;
}

Exercício 18: Crie uma função chamada copiaElementosMaioresque recebe uma pilha e
um valor limitecomo parâmetros e retorna uma cópia dos elementos maiores que o
limitena pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}
int desempilha(Pilha* pilha) {
if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

Pilha* copiaElementosMaiores(Pilha* pilha, int limite) {


Pilha* copiaPilha = criaPilha();

// Desempilhe os elementos da pilha original e copie os elementos maiores que o


limite
while (pilha->topo != -1) {
int valor = desempilha(pilha);
if (valor > limite) {
empilha(copiaPilha, valor);
}
}

// Inverte a ordem da cópia da pilha (caso deseje manter a ordem original)


Pilha* pilhaAuxiliar = criaPilha();
while (copiaPilha->topo != -1) {
int valor = desempilha(copiaPilha);
empilha(pilhaAuxiliar, valor);
}
while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(copiaPilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar

return copiaPilha;
}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");
empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);
empilha(minhaPilha, 40);
empilha(minhaPilha, 50);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

int limite = 30; // Copiar os elementos maiores que 30


Pilha* copiaDosElementosMaiores = copiaElementosMaiores(minhaPilha, limite);

printf("Cópia dos elementos maiores que %d: ", limite);


imprimirPilha(copiaDosElementosMaiores);
printf("\n");

free(minhaPilha);
free(copiaDosElementosMaiores);

return 0;
}

Exercício 19: Crie uma função chamada copiaElementosMenoresque recebe uma pilha e
um valor limitecomo parâmetros e retorna uma cópia dos elementos menores que o
limitena pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}
Pilha* copiaElementosMenores(Pilha* pilha, int limite) {
Pilha* copiaPilha = criaPilha();

// Desempilhe os elementos da pilha original e copie os elementos menores que o


limite
while (pilha->topo != -1) {
int valor = desempilha(pilha);
if (valor < limite) {
empilha(copiaPilha, valor);
}
}

// Inverte a ordem da cópia da pilha (caso deseje manter a ordem original)


Pilha* pilhaAuxiliar = criaPilha();
while (copiaPilha->topo != -1) {
int valor = desempilha(copiaPilha);
empilha(pilhaAuxiliar, valor);
}
while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(copiaPilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar

return copiaPilha;
}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);
empilha(minhaPilha, 40);
empilha(minhaPilha, 50);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

int limite = 30; // Copiar os elementos menores que 30


Pilha* copiaDosElementosMenores = copiaElementosMenores(minhaPilha, limite);

printf("Cópia dos elementos menores que %d: ", limite);


imprimirPilha(copiaDosElementosMenores);
printf("\n");

free(minhaPilha);
free(copiaDosElementosMenores);

return 0;
}

Exercício 20: Crie uma função chamada insereOrdenadoPilhaque recebe uma pilha e um
valor como parâmetros e insere o valor na pilha de forma ordenada em ordem
crescente.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

void insereOrdenadoPilha(Pilha* pilha, int valor) {


Pilha* pilhaAuxiliar = criaPilha();

// Desempilhe os elementos da pilha original e encontre a posição correta para


o novo valor
while (pilha->topo != -1 && pilha->itens[pilha->topo] < valor) {
int elemento = desempilha(pilha);
empilha(pilhaAuxiliar, elemento);
}

// Empilhe o novo valor na posição correta


empilha(pilha, valor);

// Transferir elementos maiores de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int elemento = desempilha(pilhaAuxiliar);
empilha(pilha, elemento);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

insereOrdenadoPilha(minhaPilha, 30);
insereOrdenadoPilha(minhaPilha, 10);
insereOrdenadoPilha(minhaPilha, 50);
insereOrdenadoPilha(minhaPilha, 20);
insereOrdenadoPilha(minhaPilha, 40);

printf("Pilha ordenada: ");


imprimirPilha(minhaPilha);
printf("\n");

free(minhaPilha);

return 0;
}

Exercício 21: Crie uma função chamada somaElementosPilhaque recebe uma pilha como
parâmetro e retorna a soma de todos os elementos na pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

int somaElementosPilha(Pilha* pilha) {


int soma = 0;

// Desempilhe os elementos da pilha e some-os


while (pilha->topo != -1) {
int valor = desempilha(pilha);
soma += valor;
}

return soma;
}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}
int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);
empilha(minhaPilha, 40);
empilha(minhaPilha, 50);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

int soma = somaElementosPilha(minhaPilha);


printf("Soma dos elementos na pilha: %d\n", soma);

free(minhaPilha);

return 0;
}

Exercício 22: Crie uma função chamada copiaPilhaque recebe uma pilha como parâmetro
e retorna uma cópia idêntica da pilha original.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

Pilha* copiaPilha(Pilha* pilha) {


Pilha* copia = criaPilha();
Pilha* auxiliar = criaPilha();

// Desempilhe os elementos da pilha original e empilhe na cópia


while (pilha->topo != -1) {
int valor = desempilha(pilha);
empilha(auxiliar, valor);
}

// Transferir elementos de volta para a pilha original e copia


while (auxiliar->topo != -1) {
int valor = desempilha(auxiliar);
empilha(pilha, valor);
empilha(copia, valor);
}

free(auxiliar); // Liberar a pilha auxiliar

return copia;
}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha original criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

Pilha* copiaMinhaPilha = copiaPilha(minhaPilha);

printf("Cópia da pilha: ");


imprimirPilha(copiaMinhaPilha);
printf("\n");

free(minhaPilha);
free(copiaMinhaPilha);

return 0;
}

Exercício 23: Crie uma função chamada removeElementosParesque recebe uma pilha como
parâmetro e remove todos os elementos pares da pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

void removeElementosPares(Pilha* pilha) {


Pilha* pilhaImpares = criaPilha();

// Desempilhe os elementos da pilha original e empilhe apenas os ímpares


while (pilha->topo != -1) {
int valor = desempilha(pilha);
if (valor % 2 != 0) {
empilha(pilhaImpares, valor);
}
}

// Copie os elementos de volta para a pilha original


while (pilhaImpares->topo != -1) {
int valor = desempilha(pilhaImpares);
empilha(pilha, valor);
}

free(pilhaImpares); // Liberar a pilha de ímpares


}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha original criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 21);
empilha(minhaPilha, 30);
empilha(minhaPilha, 42);
empilha(minhaPilha, 53);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

removeElementosPares(minhaPilha);

printf("Pilha sem elementos pares: ");


imprimirPilha(minhaPilha);
printf("\n");

free(minhaPilha);

return 0;
}

Exercício 24: Crie uma função chamada inverteOrdemElementosque recebe uma pilha
como parâmetro e inverte a ordem dos elementos na pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

void inverteOrdemElementos(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Desempilhe os elementos da pilha original e empilhe na pilha auxiliar


while (pilha->topo != -1) {
int valor = desempilha(pilha);
empilha(pilhaAuxiliar, valor);
}

// Copie os elementos de volta para a pilha original (agora na ordem inversa)


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}
int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha original criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);
empilha(minhaPilha, 40);
empilha(minhaPilha, 50);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

inverteOrdemElementos(minhaPilha);

printf("Pilha com elementos invertidos: ");


imprimirPilha(minhaPilha);
printf("\n");

free(minhaPilha);

return 0;
}

Exercício 25: Crie uma função chamada tamanhoPilhaque recebe uma pilha como
parâmetro e retorna o número de elementos na pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}
int tamanhoPilha(Pilha* pilha) {
return pilha->topo + 1;
}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha original criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);
empilha(minhaPilha, 40);
empilha(minhaPilha, 50);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

int tamanho = tamanhoPilha(minhaPilha);


printf("Tamanho da pilha: %d\n", tamanho);

free(minhaPilha);

return 0;
}

Exercício 26: Crie uma função chamada comparaPilhasque recebe duas pilhas como
parâmetros e verifica se elas são iguais (ou seja, têm os mesmos elementos na mesma
ordem).

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

int comparaPilhas(Pilha* pilha1, Pilha* pilha2) {


if (pilha1->topo != pilha2->topo) {
return 0; // Pilhas têm tamanhos diferentes, não são iguais
}

while (pilha1->topo != -1) {


int valor1 = desempilha(pilha1);
int valor2 = desempilha(pilha2);

if (valor1 != valor2) {
return 0; // Elementos diferentes, pilhas não são iguais
}
}

return 1; // Pilhas são iguais


}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}
int main() {
Pilha* pilhaA = criaPilha();
Pilha* pilhaB = criaPilha();

empilha(pilhaA, 10);
empilha(pilhaA, 20);
empilha(pilhaA, 30);

empilha(pilhaB, 10);
empilha(pilhaB, 20);
empilha(pilhaB, 30);

printf("Pilha A: ");
imprimirPilha(pilhaA);
printf("\n");

printf("Pilha B: ");
imprimirPilha(pilhaB);
printf("\n");

if (comparaPilhas(pilhaA, pilhaB)) {
printf("As pilhas A e B são iguais.\n");
} else {
printf("As pilhas A e B não são iguais.\n");
}

free(pilhaA);
free(pilhaB);

return 0;
}

Exercício 27: Crie uma função chamada intercalaPilhasque recebe duas pilhas como
parâmetros e cria uma terceira pilha com os elementos intercalados das duas pilhas
originais.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}
int desempilha(Pilha* pilha) {
if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

Pilha* intercalaPilhas(Pilha* pilhaA, Pilha* pilhaB) {


Pilha* pilhaResultado = criaPilha();

Pilha* pilhaAuxiliarA = criaPilha();


Pilha* pilhaAuxiliarB = criaPilha();

// Desempilhe os elementos das duas pilhas originais e empilhe na pilha de


resultado
while (pilhaA->topo != -1 || pilhaB->topo != -1) {
if (pilhaA->topo != -1) {
int valorA = desempilha(pilhaA);
empilha(pilhaResultado, valorA);
empilha(pilhaAuxiliarA, valorA);
}

if (pilhaB->topo != -1) {
int valorB = desempilha(pilhaB);
empilha(pilhaResultado, valorB);
empilha(pilhaAuxiliarB, valorB);
}
}

// Transferir elementos de volta para as pilhas originais


while (pilhaAuxiliarA->topo != -1) {
int valorA = desempilha(pilhaAuxiliarA);
empilha(pilhaA, valorA);
}

while (pilhaAuxiliarB->topo != -1) {


int valorB = desempilha(pilhaAuxiliarB);
empilha(pilhaB, valorB);
}

free(pilhaAuxiliarA);
free(pilhaAuxiliarB);

return pilhaResultado;
}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* pilhaA = criaPilha();
Pilha* pilhaB = criaPilha();

empilha(pilhaA, 10);
empilha(pilhaA, 30);
empilha(pilhaA, 50);

empilha(pilhaB, 20);
empilha(pilhaB, 40);

printf("Pilha A: ");
imprimirPilha(pilhaA);
printf("\n");

printf("Pilha B: ");
imprimirPilha(pilhaB);
printf("\n");

Pilha* pilhaC = intercalaPilhas(pilhaA, pilhaB);

printf("Pilha C (intercalada): ");


imprimirPilha(pilhaC);
printf("\n");

free(pilhaA);
free(pilhaB);
free(pilhaC);

return 0;
}

Exercício 28: Crie uma função chamada removeElementoEspecificoque recebe uma pilha
e um valor como parâmetros e remove todas as ocorrências desse valor na pilha.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

void removeElementoEspecifico(Pilha* pilha, int valor) {


Pilha* pilhaTemporaria = criaPilha();

while (pilha->topo != -1) {


int elemento = desempilha(pilha);
if (elemento != valor) {
empilha(pilhaTemporaria, elemento);
}
}

// Copie os elementos de volta para a pilha original


while (pilhaTemporaria->topo != -1) {
int elemento = desempilha(pilhaTemporaria);
empilha(pilha, elemento);
}

free(pilhaTemporaria); // Liberar a pilha temporária


}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha original criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);
empilha(minhaPilha, 20);
empilha(minhaPilha, 40);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

int valorARemover = 20;


removeElementoEspecifico(minhaPilha, valorARemover);

printf("Pilha após remover %d: ", valorARemover);


imprimirPilha(minhaPilha);
printf("\n");

free(minhaPilha);

return 0;
}

Exercício 29: Crie uma função chamada copiaInvertidaPilhaque recebe uma pilha como
parâmetro e retorna uma cópia invertida (em ordem contrária) da pilha original.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

Pilha* copiaInvertidaPilha(Pilha* pilhaOriginal) {


Pilha* pilhaAuxiliar = criaPilha();
Pilha* pilhaCopiaInvertida = criaPilha();
// Desempilhe os elementos da pilha original e empilhe na pilha auxiliar na
ordem inversa
while (pilhaOriginal->topo != -1) {
int valor = desempilha(pilhaOriginal);
empilha(pilhaAuxiliar, valor);
}

// Copie os elementos da pilha auxiliar para a pilha de cópia invertida


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilhaCopiaInvertida, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar

return pilhaCopiaInvertida;
}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha original criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);
empilha(minhaPilha, 40);
empilha(minhaPilha, 50);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

Pilha* pilhaCopiaInvertida = copiaInvertidaPilha(minhaPilha);

printf("Cópia invertida da pilha original: ");


imprimirPilha(pilhaCopiaInvertida);
printf("\n");

free(minhaPilha);
free(pilhaCopiaInvertida);

return 0;
}

Exercício 30: Crie uma função chamada pilhaEhPalindromoque recebe uma pilha como
parâmetro e verifica se ela representa um palíndromo. Um palíndromo é uma sequência
que é igual quando lida da esquerda para a direita e da direita para a esquerda.

typedef struct {
int itens[MAX_TAMANHO];
int topo;
} Pilha;

Pilha* criaPilha() {
Pilha* novaPilha = (Pilha*)malloc(sizeof(Pilha));
if (novaPilha == NULL) {
printf("Erro: Falha na alocação de memória para a pilha.\n");
exit(1);
}
novaPilha->topo = -1; // Inicializa o topo como -1 (pilha vazia)
return novaPilha;
}

void empilha(Pilha* pilha, int valor) {


if (pilha->topo == MAX_TAMANHO - 1) {
printf("Erro: Pilha cheia, não é possível empilhar o valor %d.\n", valor);
} else {
pilha->itens[++(pilha->topo)] = valor;
}
}

int desempilha(Pilha* pilha) {


if (pilha->topo == -1) {
printf("Erro: Pilha vazia, não é possível desempilhar.\n");
return -1; // Ou outro valor de erro adequado
} else {
return pilha->itens[(pilha->topo)--];
}
}

bool pilhaEhPalindromo(Pilha* pilha) {


Pilha* pilhaInvertida = criaPilha();

// Copie os elementos da pilha original para uma pilha invertida


for (int i = 0; i <= pilha->topo; i++) {
empilha(pilhaInvertida, pilha->itens[i]);
}

// Compare os elementos das duas pilhas


while (pilha->topo != -1) {
int elementoOriginal = desempilha(pilha);
int elementoInvertido = desempilha(pilhaInvertida);

if (elementoOriginal != elementoInvertido) {
free(pilhaInvertida);
return false; // Não é um palíndromo
}
}
free(pilhaInvertida);
return true; // É um palíndromo
}

void imprimirPilha(Pilha* pilha) {


Pilha* pilhaAuxiliar = criaPilha();

// Imprimir elementos da pilha enquanto os desempilha


while (pilha->topo != -1) {
int valor = desempilha(pilha);
printf("%d ", valor);
empilha(pilhaAuxiliar, valor);
}

// Transferir elementos de volta para a pilha original


while (pilhaAuxiliar->topo != -1) {
int valor = desempilha(pilhaAuxiliar);
empilha(pilha, valor);
}

free(pilhaAuxiliar); // Liberar a pilha auxiliar


}

int main() {
Pilha* minhaPilha = criaPilha();
printf("Pilha original criada com sucesso!\n");

empilha(minhaPilha, 10);
empilha(minhaPilha, 20);
empilha(minhaPilha, 30);
empilha(minhaPilha, 20);
empilha(minhaPilha, 10);

printf("Pilha original: ");


imprimirPilha(minhaPilha);
printf("\n");

if (pilhaEhPalindromo(minhaPilha)) {
printf("A pilha representa um palíndromo.\n");
} else {
printf("A pilha NÃO representa um palíndromo.\n");
}

free(minhaPilha);

return 0;
}

Você também pode gostar