Informática, perguntado por Aryanaigor89, 10 meses atrás

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

Respondido por Gabrielmartinsseco
2

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!

Perguntas interessantes