Todo dispositivo digital, internamente, trabalha com dados formatados em estruturas específicas para resolver problemas particulares. Na vida profissional de um desenvolvedor, frequentemente, ele irá se deparar com situações nas quais é preciso identificar qual estrutura de dados é a mais adequada para determinada função.
Tomando por base as pilhas, pode-se realizar diversas operações para solucionar problemas. Uma dessas operações é a inversão dos dados de uma lista. Para se inverter a ordem dos dados de uma fila, vetor ou arquivo, basta desempilhar os seus valores e empilhá-los na ordem em que eles foram desempilhados. Ou seja, no mesmo momento em que se desempilha um elemento, deve-se empilha-lo em um novo local para que, ao final, repetindo esse processo, todos os elementos se invertam.
INSTRUÇÕES:
No caso das pilhas, as prerrogativas são as seguintes:
1 – A inserção de novos elementos é feita sempre ao final da pilha.
2 – A remoção de elementos também é feita somente no fim da pilha.
Assim, dizemos que a pilha opera ao estilho Last In, First Out (LIFO), ou seja, o último a entrar é o primeiro a sair.
Você deverá desenvolver um programa em Linguagem C que execute os seguintes passos:
1 - Preencher uma pilha com os números do seu R.A.;
2 - Imprimir a pilha na ordem em que os elementos foram inseridos (iniciando pela base, e finalizando pelo topo);
3 – Desempilhar todos os elementos, inserindo-os em uma segunda estrutura de dados do tipo pilha;
4 - Imprimir a nova pilha na ordem em que os elementos foram inseridos (iniciando pela base, e finalizando pelo topo).
Observação importante: seu código-fonte deve declara duas estruturas de dados tipo pilha distintas. A primeira impressão dos dados que seu programa deve fazer está relacionada ao conteúdo da primeira pilha (itens 1 e 2 do passo a passo apresentado acima). Já a segunda impressão dos dados que seu programa fará, está relacionada aos dados que foram inseridos na segunda pilha.
O resultado da execução do seu algoritmo, supondo que seu R.A. é igual ao número 12345678, deverá ser algo parecido com o seguinte:
Método de entrega: enviar o código fonte (arquivo.c) nomeando o arquivo com seu nome completo. Exemplo: Pietro_Martins_de_Oliveira.c
Soluções para a tarefa
//Código abaixo em DEV C++.
// A formatação aqui fica feia mas é só colar no DEV C que fica bom.
// 18/05/2020
//-----------------------------
// CRIA A ESTRUTURA DA PILHA
// ---------------------------
struct pilha {
int elemento[101]; // vetor que irá armazenar os elementos da pilha
int elementos; // indicador do tamanho da pilha
};
//----------------------------
// DECLARA AS FUNÇÕES
// ---------------------------
bool empilha(int valor,pilha *mystack ); // insere elementos na pilha
int desempilha(struct pilha *mystack ); // retira elemento da pilha
void imprimepilha(pilha *mystack ); // imprime a pilha
//----------------------------
// INICIO DO PROGRAMA
// ---------------------------
int main( ) {
pilha pilha1; // Declara a primeira pilha
pilha pilha2; // Declara a segunda pilha
pilha1.elementos = pilha2.elementos = 0; // inicializa as pilhas.
// ADICIONA ELEMENTOS À PILHA 1 - Para RA 12345678
empilha(1,&pilha1); // Chama a função empilha
empilha(2,&pilha1); // o primeiro argumento é o numero a adicionar
empilha(3,&pilha1); // o segundo argumento é o endereço da pilha
empilha(4,&pilha1);
empilha(5,&pilha1);
empilha(6,&pilha1);
empilha(7,&pilha1);
empilha(8,&pilha1);
imprimepilha(&pilha1); // Chama a função imprimepilha. Argumento é o endereço da pilha
// DESEMPILHA ELEMENTOS DA PILHA 1, PASSANDO PARA PILHA 2
empilha(desempilha(&pilha1),&pilha2); // desempilha da pilha 1, e empilha na pilha 2
empilha(desempilha(&pilha1),&pilha2); // o primeiro argumento é a função desempilha, que
empilha(desempilha(&pilha1),&pilha2); // desempilha o numero da pilha 1
empilha(desempilha(&pilha1),&pilha2); // o segundo argumento é o endereço da pilha 2
empilha(desempilha(&pilha1),&pilha2); // seria possivel fazer isso usando uma variavel
empilha(desempilha(&pilha1),&pilha2); // intermediaria para armazenar o valor desempilhado
empilha(desempilha(&pilha1),&pilha2); // da pilha1 antes de empilhar na pilha2
empilha(desempilha(&pilha1),&pilha2); //
imprimepilha(&pilha2); // Chama a função imprimepilha. Argumento é o endereço da pilha
return 0;
}
//----------------------------
// LISTA DE FUNÇÕES
// ---------------------------
//--------------------------------------------
// FUNÇÃO EMPILHA - ADICIONA NUMERO A PILHA
// -------------------------------------------
bool empilha(int valor,pilha *mystack) { // retorna TRUE se adicionou, e FALSE se erro
if (mystack->elementos==100) // se já estiver no tamanho máximo da pilha: 100 elementos
{
printf("Tamanho máximo da pilha excedido.\n"); // stack overflow
return false; // Retorna mensagem de erro ao chamador da função
}
mystack->elemento[mystack->elementos]=valor; // adiciona o valor ao vetor da pilha
mystack->elementos++; // atualiza numero de elementos
//printf( "Elementos : %d\n", mystack->elementos);
//printf( "Elemento incluido: %d\n\n", valor);
return true; // retorna mensagem de sucesso
}
//----------------------------------------------
// FUNÇÃO DESEMPILHA - RETIRA NUMERO A PILHA
// ---------------------------------------------
int desempilha(pilha *mystack ) { // retorna o valor retirado da pilha e -1 se erro.
if (mystack->elementos==0) // pilha vazia
{
printf("Nao ha elementos na pilha.\n"); // pilha zerada
return -1; // Retorna mensagem de erro ao chamador da função
}
mystack->elementos--; // atualiza numero de elementos. Nao há necessidade de editar o vetor.
//printf( "Elementos : %d\n", mystack->elementos);
return mystack->elemento[mystack->elementos]; // retorna elemento desempilhado.
}
// -----------------------------------------------------
// FUNÇÃO IMPRIMEPILHA - para gerar o output da tarefa.
// -----------------------------------------------------
void imprimepilha(pilha *mystack )
{
if (mystack->elementos==0) // pilha vazia
{
printf("Nao ha elementos na pilha.\n"); // pilha zerada, mensagem de erro
return; // retorna a main
}
for (int i=0;i<mystack->elementos;i++) // Estrutura de repetição, corre os elementos do vetor
printf( "%d ", mystack->elemento[i]); // imprime o numero, e segue um espaço " ".
printf("\n"); // enter no final
return; // retorna a main
}
Quem conseguiu .c?
Resposta:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int elemento[101];
int elementos;
}pilha;
int empilha (int valor, pilha *p);
int desempilha (pilha *p);
void imprimepilha(pilha *p);
int main( ) {
pilha pilha1;
pilha pilha2;
pilha1.elementos = pilha2.elementos = 0;
empilha(1,&pilha1);
empilha(2,&pilha1);
empilha(3,&pilha1);
empilha(4,&pilha1);
empilha(5,&pilha1);
empilha(6,&pilha1);
empilha(7,&pilha1);
empilha(8,&pilha1);
imprimepilha(&pilha1);
empilha(desempilha(&pilha1),&pilha2);
empilha(desempilha(&pilha1),&pilha2);
empilha(desempilha(&pilha1),&pilha2);
empilha(desempilha(&pilha1),&pilha2);
empilha(desempilha(&pilha1),&pilha2);
empilha(desempilha(&pilha1),&pilha2);
empilha(desempilha(&pilha1),&pilha2);
empilha(desempilha(&pilha1),&pilha2);
imprimepilha(&pilha2);
return 0;
}
int empilha(int valor,pilha *p) {
if (p->elementos==100)
{
printf("Tamanho máximo da pilha excedido.\n");
return 1;
}
p->elemento[p->elementos]=valor;
p->elementos++;
return 0;
}
int desempilha (pilha *p) {
if (p->elementos==0)
{
printf("Nao ha elementos na pilha.\n");
return -1;
}
p->elementos--;
return p->elemento[p->elementos];
}
void imprimepilha (pilha *p)
{
if (p->elementos == 0)
{
printf("Nao ha elementos na pilha.\n");
return;
}
for (int i=0; i<p->elementos; i++)
printf( "%d ", p->elemento[i]);
printf("\n");
return;
}
Explicação:
se der esse erro [Error] 'for' loop initial declarations are only allowed in C99 or C11 mode
faça isso
Configurar o Dev C++ para usar o padrão ansi iso c99 (recomendado para evitar mais problemas de compatibilidade com os exercícios do livro).
– na barra de ferramentas do dev c++ clique em Ferramentas, depois clique em Opções do Compilador , vai abrir uma janelinha, clique na aba Geração de Código, aonde diz Padrão da Linguagem (-std) selecione para ISO C99 e clique em Ok, agora seu código vai funcionar, e não vai aparecer mais essa mensagem de erro.