Faça um programa em linguagem C, que implemente uma pilha simples de números inteiros, com quantidade dinâmica de elementos a serem digitados pelo usuário e de forma que permita as seguintes interações. Mostrar elementos da pilha desordenados (ou seja, na sequencia em que o usuário inseriu os elementos); Mostrar elementos da pilha em ordem crescente; Mostrar elementos da pilha em ordem decrescente; Remover elementos da pilha; Inserir elementos da pilha;
Soluções para a tarefa
Resposta:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
typedef struct
{
int dado;
struct Tpilha* ant;
}Tpilha;
typedef struct
{
Tpilha* topo;
}pilha;
//VERIFICAR SE A PILHA ESTÁ VAZIA
int pilha_vazia(pilha* p)
{
if (p->topo == NULL)
return 1;
else
return 0;
}
void mostrar_pilha(pilha* p)
{
printf("\n\n PILHA..: ");
if (pilha_vazia(p))
return 1;
Tpilha* aux = (Tpilha*)malloc(sizeof(Tpilha));
aux = p->topo;
while (aux != NULL)
{
printf("%3d |", aux->dado);
aux = aux->ant;
}
}
//ORDENAR PILHA CRESCENTEMENTE
void ordem_crescente(pilha* p, int tam)
{
if (pilha_vazia(p))
{
printf("\n\n\t AS ESTRUTURAS ESTÃO VAZIAS...");
printf("\n\n\n PRESSIONE QUALQUER TECLA PARA CONTINUAR...");
getch();
return 1;
}
int i, j, x;
int* vet = (int*)malloc(sizeof(int) * tam);
for (i = 0; i < tam; i++)
{
Tpilha* aux = (Tpilha*)malloc(sizeof(Tpilha));
aux = p->topo;
vet[i] = aux->dado;
p->topo = aux->ant;
aux->ant = NULL;
free(aux);
}
//ORDENAR VETOR DINÂMICO
for (i = 0; i < tam; i++)
{
for (j = 0; j < tam - 1; j++)
{
if (vet[j] > vet[j + 1])
{
x = vet[j + 1];
vet[j + 1] = vet[j];
vet[j] = x;
}
}
}
printf("\n\n PILHA ORDENADA CRESCENTEMENTE:\n\n\n PILHA..: ");
for (i = 0; i < tam; i++)
{
Tpilha* novo = (Tpilha*)malloc(sizeof(Tpilha));
novo->dado = vet[i];
novo->ant = p->topo;
p->topo = novo;
printf("%3d |", novo->dado);
}
printf("\n\n\n\n\t PRESSIONE QUALQUER TECLA PARA CONTINUAR...");
getch();
}
//ORDENAR PILHA DECRESCENTEMENTE
void ordem_decrescente(pilha* p, int tam)
{
if (pilha_vazia(p))
{
printf("\n\n\t AS ESTRUTURAS ESTÃO VAZIAS...");
printf("\n\n\n PRESSIONE QUALQUER TECLA PARA CONTINUAR...");
getch();
return 1;
}
int i, j, x;
int* vet = (int*)malloc(sizeof(int) * tam);
for (i = 0; i < tam; i++)
{
Tpilha* aux = (Tpilha*)malloc(sizeof(Tpilha));
aux = p->topo;
vet[i] = aux->dado;
p->topo = aux->ant;
aux->ant = NULL;
free(aux);
}
//ORDENAR VETOR DINÂMICO
for (i = 0; i < tam; i++)
{
for (j = 0; j < tam - 1; j++)
{
if (vet[j] < vet[j + 1])
{
x = vet[j + 1];
vet[j + 1] = vet[j];
vet[j] = x;
}
}
}
printf("\n\n PILHA ORDENADA DECRESCENTEMENTE:\n\n\n PILHA..: ");
for (i = 0; i < tam; i++)
{
Tpilha* novo = (Tpilha*)malloc(sizeof(Tpilha));
novo->dado = vet[i];
novo->ant = p->topo;
p->topo = novo;
printf("%3d |", novo->dado);
}
printf("\n\n\n\n\t PRESSIONE QUALQUER TECLA PARA CONTINUAR...");
getch();
}
//INSERIR VALORES NAS ESTRUTURAS
void empilhar(pilha* p, int* tam)
{
int i, valor;
printf("\n\n=================================");
for (i = 0; i < *tam; i++)
{
printf("\n\n INFORME O %d VALOR: ", i + 1);
fflush(stdin);
scanf("%d", &valor);
//INSERIR ELEMENTOS NA PILHA
Tpilha* novo = (Tpilha*)malloc(sizeof(Tpilha));
novo->dado = valor;
novo->ant = p->topo;
p->topo = novo;
}
printf("\n=================================");
}
//REMOVER VALORES DAS ESTRUTURAS
void desempilhar(pilha* p, int* tam)
{
if (pilha_vazia(p))
{
printf("\n\n\t AS ESTRUTURAS ESTÃO VAZIAS...");
printf("\n\n\n PRESSIONE QUALQUER TECLA PARA CONTINUAR...");
getch();
return 1;
}
//REMOVER ELEMENTO DA PILHA
Tpilha* aux = (Tpilha*)malloc(sizeof(Tpilha));
aux = p->topo;
p->topo = aux->ant;
aux->ant = NULL;
free(aux);
*tam = *tam - 1;
}
void create_pilha(pilha* p)
{
p->topo = NULL;
}
void menu(pilha *p)
{
int opc, tam;
do
{
system("cls");
mostrar_pilha(p);
printf("\n\n\n\t==========");
printf("\n\t|| MENU ||");
printf("\n\t==========\n");
printf("\n\n 1 - INSERIR VALOR");
printf("\n\n 2 - REMOVER VALOR");
printf("\n\n 3 - MOSTRAR ELEMENTOS ORDENADOS CRESCENTEMENTE");
printf("\n\n 4 - MOSTRAR ELEMENTOS ORDENADOS DECRESCENTEMENTE");
printf("\n\n 5 - SAIR\n");
printf("\n\n\n ESCOLHA UMA OPÇÃO: ");
fflush(stdin);
scanf("%d", &opc);
switch (opc)
{
case 1:
system("cls");
printf("\n\n 1 - INSERIR VALOR\n\n");
printf("\n\n\t INFORME A QUANTIDADE DE ELEMENTOS QUE DESEJA INSERIR: ");
fflush(stdin);
scanf("%d", &tam);
empilhar(p,&tam);
break;
case 2:
desempilhar(p,&tam);
break;
case 3:
ordem_crescente(p, tam);
break;
case 4:
ordem_decrescente(p, tam);
break;
case 5:
printf("\n\n\t PROGRAMA FINALIZADO...\n\n");
break;
default:
printf("\n\n OPÇÃO NÃO ENCONTRADA...");
printf("\n\n\n PRESSIONE QUALQUER TECLA PARA CONTINUAR...");
getch();
break;
}
} while (opc != 5);
}
int main()
{
setlocale(LC_ALL, "PORTUGUESE");
pilha* p;
create_pilha(&p);
menu(&p);
return 0;
}
Explicação:
Quaisquer dúvidas, estou à disposição!
Abraços e bons estudos!