Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas em programar pilha em C++


raphael monteiro

Pergunta

ola amigos so novo aqui no forum to fazendo um trabalho e to tendo uma dificuldade em para a opreção de empilhar quando chega no valor definido por MAX variavel q usei para definir o tamanho do meu vetor. vo dar uma breve introdução doque to fazendo. Bom tenho que fazer 1 programa usando pilha com as seguintes funções: empilhar, desempilhar, imprimir a pilha, imprimir o topo.

as funções eu não posso alterar, tenho q fazer o trabalho baseado nelas!

oque me foi dado para fazer o trabalho foi.

o prototipo das funções

void iniciarPilha(TPilha *ptr);

void empilhar(TPessoa p, TPilha *ptr);

TPessoa Desempilhar(TPilha *ptr);

TPessoa topo(TPilha *ptr);

void imprimirPilha(TPilha *ptr);

e as estruturas

typedef struct Pessoa{

char nome[30];

int idade;

}TPessoa;

typedef struct Pilha{

TPessoa pessoas[MAX];

int topo;

}TPilha;

ai vai o que eu já fiz!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include <ctype.h>

#define MAX 3

typedef struct Pessoa{
        char nome[30];
     int idade;
}TPessoa;
typedef struct Pilha{
        int topo;
        TPessoa pessoas[MAX];
}TPilha;

//--------Funções---------
int menu();
void iniciaPilha (TPilha *p);
int pilhaVazia(TPilha *L);
int pilhaCheia(TPilha *L);
void empilha(TPessoa p, TPilha *L);
void topo(TPilha *ptr);
void imprimirPilha(TPilha *L);
void Desempilhar(TPilha *L, TPessoa *excluida);
//-------------------------

int main () {
    TPilha Pilha;
    TPilha * EPilha=&Pilha;
    iniciaPilha (&Pilha);
    TPessoa pes;
    int opt;
    do{
       opt = menu();
           switch(opt){
                       case 1:{// empilha
                            if(pilhaCheia(&Pilha)==1){
                                 puts ("pilha cheia!");
                       }
                            else {
                                 printf("Informa -> 1)nome 2)idade\n");
                                 fflush(stdin);
                                 gets(pes.nome);
                                 scanf("%i",&pes.idade);
                                 empilha(pes, &Pilha);
                                 system("cls");
                       }
                       break;
                       }
                       case 2:{// desempilhar
                            printf ("informa o nome da pessoa a ser removida:");
                            fflush(stdin);
                            gets(pes.nome);
                            Desempilhar(EPilha, &pes);
                            printf("---REMOVENDO---\n");
                            printf("Nome: %s\n",pes.nome);
                            printf("Idade: %i\n",pes.idade);
                       break;
                       }
                       case 3:{ // mostrar o topo
                            topo (EPilha);
                       break;
                       }
                       case 4:{ // imprimir pilha
                            imprimirPilha(EPilha);
                       break;
                       }
                       case 5:{ // inicia pilha
                            iniciaPilha (EPilha);
                       break;
                       }
                       case 0:{ //sai do programa

                       break;
                       }// fim case 0
           }//fim switch
    }while(opt != 0); // fim do
    system("pause");
    return 0;
} // fim main

int menu(){
    int opt;
    printf("1 - Empilhar\n");
    printf("2 - Desempilhar\n");
    printf("3 - Mostrar Topo\n");
    printf("4 - Imprimir pilha\n");
    printf("5 - Iniciar pilha\n");
    printf("0 - Sair\n");
    scanf("%i",&opt);
    system("cls");
    return opt;
}

void iniciaPilha(TPilha *L) {
     L->topo = MAX;
}

int pilhaVazia(TPilha *L){//bool
    if(L->topo == MAX )
        return 1; //true
    else
        return 0; //false
}

int pilhaCheia(TPilha *L){
    if (L->topo == -1)
        return 1;
    else
        return 0;
}

void empilha(TPessoa p, TPilha *L){ // empilhar.
     if (pilhaCheia(L))
          printf ("Pilha Cheia!\n\n");
     else {
          L->topo--;
          L->pessoas[L->topo]=p;
     }//fim else
} //fim empilha

void topo(TPilha *L){ // imprimir o topo da pilha.
     if(L->topo==MAX)
          puts("A pilha esta vazia!\n");
     else{
          printf("Nome: %s ",L->pessoas[L->topo].nome);
          printf("Idade: %i\n",L->pessoas[L->topo].idade);
     }//fim do else
}// fim topo

void imprimirPilha(TPilha *L){ // imprimir a pilha completa.
      if(L->topo==MAX){
          puts("A pilha esta vazia!\n");
          }
     else{
                 int i=L->topo;
                 while(i<MAX){
                 printf("Nome: %s ",L->pessoas[i].nome);
                 printf("Idade: %i\n",L->pessoas[i].idade);
                 i++;
           }// fim while
     }// fim else
}// fim imprimir

void Desempilhar(TPilha *L, TPessoa *excluida){
     if (L->topo == MAX){
        printf ("\n Pilha vazia!!!\n");
     }//fim if
     else {
          int i;
          for (i=MAX-1;i>=(L->topo); i--){
              if(!strcmp(excluida->nome, L->pessoas[i].nome)){
                     int ii=i;
                     i--;
                     for (ii=ii; i>-1; ii--, i--){
                         L->pessoas[ii] = L->pessoas[i];
                     }//fim for
                     L->topo++;
                     break;
               }//fim do if
          }//fim for
     }//fim else
}// fim desepilha

Ai galera agora so não to conseguindo fazer o empilhar respeitar o limite definido! me da uma força ai to definindo MAX como 3 e a função empilha não para quando empilho o 3 nome ele vai ate eu enjuar!

obrigado desde já espero vocês possam me ajudar. sei que não e legal ficar perguntando como faz e tal se ta certo e tal porque isso toma bastante o tempo da gente mais to realmente com essa dificuldade to fazendo estre programa desde ontem atarde. e cheguei ate ai já tem umas 3 horas q tento resolver esse problema do limite MAX e de desempilhar!

Editado por raphael monteiro
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Case não precisa de chaves.

Não use gets.

Fflush não está definido p/ stdin.

Muito cuidado com %i, porque não é a mesma coisa que %d.

Se você já está usando opt != 0 como saída do while, não precisa colocar isso no case, já que não vai executar nenhuma ação.

Comentários tipo fim if só têm sentido quando você está aninhando muitos ifs e cada um com uma condição diferente numa função gigante. Não é necessário colocar chaves num if que possui apenas um comando e colocando chaves num if desses, é óbvio que a chave que fecha o bloco demarca o fim do if.

Evite esses nomes de variáveis:

int ii=i;
. Existem outras letras no alfabeto p/ usar como indice.
int ii=i;
i--;
for (ii=ii; i>-1; ii--, i--)
Você já inicializou a variável. É só deixar a primeira parte do for vazia. P/ desempilhar faltou a verificação de pilha vazia. O iniciarPilha deveria fazer o quê?
void iniciaPilha(TPilha *L) {
     L->topo = MAX;
}
Assim você está dizendo que o topo da pilha é a posição do terceiro dado. Mas quando se fala de topo de pilha, é o próximo lugar onde será inserido o dado. Se é pilha, você remove do topo (o único caso onde vi remoção da base em uma pilha -- e não era bem remoção, mas substituição de valores -- era em uma implementação de um algoritmo de substituição de página). Por que fornecer o nome da pessoa a remover?
#include<stdio.h>
#include<string.h>
#include <ctype.h>
#include <stdlib.h>

#define MAX 3
#define MAXNOME 30

typedef struct Pessoa{
     char nome[MAXNOME];
     int idade;
}TPessoa;

typedef struct Pilha{
        int topo;
        TPessoa pessoas[MAX];
}TPilha;


int menu();
void iniciaPilha (TPilha *p);
int pilhaVazia(TPilha *L);
int pilhaCheia(TPilha *L);
void empilha(TPessoa p, TPilha *L);
void topo(TPilha *ptr);
void imprimirPilha(TPilha *L);
void Desempilhar(TPilha *L);


int main () {
    TPilha Pilha;
    TPilha * EPilha=&Pilha;
    iniciaPilha (&Pilha);
    TPessoa pes;
    int opt;
    do{
       opt = menu();
       switch(opt){
           case 1:
              if(pilhaCheia(&Pilha)==1)
                 puts ("pilha cheia!");
              else {
                 printf("Informa -> 1)nome 2)idade\n");
                 scanf("%30s",&pes.nome);
                 scanf("%d",&pes.idade);
                 empilha(pes, &Pilha);
              }
              break;

           case 2:
              if (pilhaVazia)
                  Desempilhar(EPilha);
               break;

           case 3:
              topo (EPilha);
              break;

           case 4:
              imprimirPilha(EPilha);
              break;

           case 5:
              iniciaPilha (EPilha);
              break;
       }
    }while(opt != 0); 
    return 0;
} 

int menu(){
    int opt;
    printf("1 - Empilhar\n");
    printf("2 - Desempilhar\n");
    printf("3 - Mostrar Topo\n");
    printf("4 - Imprimir pilha\n");
    printf("5 - Iniciar pilha\n");
    printf("0 - Sair\n");
    scanf("%d",&opt);
    return opt;
}

void iniciaPilha(TPilha *L) {
     L->topo = 0;
}

int pilhaVazia(TPilha *L){//bool
    if(L->topo == 0 )
        return 1; //true
    else
        return 0; //false
}

int pilhaCheia(TPilha *L){
    if (L->topo == MAX)
        return 1;
    else
        return 0;
}

void empilha(TPessoa p, TPilha *L){
     if (pilhaCheia(L))
          printf ("Pilha Cheia!\n\n");
     else {
          L->pessoas[L->topo]=p;
          L->topo++;
     }
}

void topo(TPilha *L){ // imprimir o topo da pilha.
     if(L->topo == 0)
          puts("A pilha esta vazia!\n");
     else{
          printf("Nome: %s ",L->pessoas[L->topo-1].nome);
          printf("Idade: %d\n",L->pessoas[L->topo-1].idade);
     }
}

void imprimirPilha(TPilha *L){
      if(L->topo == 0)
          puts("A pilha esta vazia!\n");
     else{
          int i;
          for(i=0; i<L->topo; i++){
           printf("Nome: %s ",L->pessoas[i].nome);
              printf("Idade: %d\n",L->pessoas[i].idade);
           }
     }
}

void Desempilhar(TPilha *L){
     if (L->topo == 0)
        printf ("\n Pilha vazia!!!\n");
     else
     L->topo--;
}

Link para o comentário
Compartilhar em outros sites

  • 0

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include <ctype.h>
#define MAX 5

typedef struct Pessoa{
        char nome[30];
        int idade;
}TPessoa;
typedef struct Pilha{
        int topo;
        TPessoa pessoas[MAX];
}TPilha;

//--------Funções---------
int menu();
void iniciaPilha (TPilha *p);
int pilhaVazia(TPilha *L);
int pilhaCheia(TPilha *L);
void empilha(TPessoa p, TPilha *L);
TPessoa topo(TPilha *ptr);
void imprimirPilha(TPilha *L);
TPessoa Desempilhar(TPilha *L);
//-------------------------

int main () {
    TPilha Pilha;
    
    iniciaPilha (&Pilha);
    TPessoa pes;
    int opt;
    do{
       opt = menu();
           switch(opt){
                       case 1:{// empilha
                            if(pilhaCheia(&Pilha)==1){
                                    printf("Pilha cheia.\n");
                            }
                            else {
                                 printf("Informa -> 1)nome 2)idade\n");
                                 fflush(stdin);
                                 gets(pes.nome);
                                 scanf("%i",&pes.idade);
                                 empilha(pes, &Pilha);
                                 system("cls");
                       }
                       break;
                       }
                       case 2:{// desempilhar
                            Desempilhar(&Pilha);
                            printf("---REMOVENDO---\n");
                            printf("Nome: %s\n",pes.nome);
                            printf("Idade: %i\n",pes.idade);
                       break;
                       }
                       case 3:{ // mostrar o topo
                            topo (&Pilha);
                       break;
                       }
                       case 4:{ // imprimir pilha
                            imprimirPilha(&Pilha);
                       break;
                       }
                       case 5:{ // inicia pilha
                            iniciaPilha (&Pilha);
                       break;
                       }
                       case 0:{ //sai do programa
                            printf("-----Saindo!-----\n");
                       break;
                       default:
                            printf("Opcao Invalida!\n");
                       }// fim case 0
           }//fim switch
    }while(opt != 0); // fim do
    system("pause");
    return 0;
} // fim main

int menu(){
    int opt;
    printf("1 - Empilhar\n");
    printf("2 - Desempilhar\n");
    printf("3 - Mostrar Topo\n");
    printf("4 - Imprimir pilha\n");
    printf("5 - Iniciar pilha\n");
    printf("0 - Sair\n");
    scanf("%i",&opt);
    system("cls");
    return opt;
}

void iniciaPilha(TPilha *L) {
     L->topo = MAX;
}

int pilhaVazia(TPilha *L){//bool
    if(L->topo == MAX )
        return 1; //true
    else
        return 0; //false
}

int pilhaCheia(TPilha *L){
    if (L->topo == -1)
        return 1;
    else
        return 0;
}

void empilha(TPessoa p, TPilha *L){ // empilhar.
     if (L->topo == -1)
          printf ("Pilha Cheia!\n\n");
     else {
          L->topo--;
          L->pessoas[L->topo]=p;
     }//fim else
} //fim empilha

TPessoa topo(TPilha *L){ // imprimir o topo da pilha.
     if(L->topo==MAX)
          puts("A pilha esta vazia!\n");
     else{
          printf("Nome: %s ",L->pessoas[L->topo].nome);
          printf("Idade: %i\n",L->pessoas[L->topo].idade);
     }//fim do else
}// fim topo

void imprimirPilha(TPilha *L){ // imprimir a pilha completa.
      if(L->topo==MAX){
          puts("A pilha esta vazia!\n");
          }
     else{
                 int i=L->topo;
                 while(i<MAX){
                 printf("Nome: %s ",L->pessoas[i].nome);
                 printf("Idade: %i\n",L->pessoas[i].idade);
                 i++;
           }// fim while
     }// fim else
}// fim imprimir

TPessoa Desempilhar(TPilha *L){
     if (L->topo == MAX)
        printf ("\n Pilha vazia!!!\n");
     else L->topo++;
}// fim desepilha

vlw pelas dicas já alterei muito os comandos. agora so to tendo erros na hora de desempilhar, e ainda não consegui entender porque o valor definido por MAX não funciona. a função iniciar pilha e so pra reinciar a função. vo retirar os //fim if etc...

A dificuldade q to tendo no desempilhar é que vamos supor que eu empilhei nesta ordem ... Nome A - Idade 1, Nome b - Idade 2, Nome c - Idade 3. otimo dai eu mando desempilhar, oque acontece, ele desempilha tira o nome e a idade e mostra " REMOVENDO Nome c - Idade 3 " dai eu mando desempilhar novamente porem agora a pilha já esta " Nome A - Idade 1, Nome b - Idade 2 " certo, dinovo ele vai mostrar " REMOVENDO Nome c - Idade 3 ". isso e q não quero quero q ele mostre " REMOVENDO Nome B - Idade 2 ". e o valor de MAX q eu to falando e q ele ta definido em 5 mais ele não diz pilha cheia. nunca!

obrigado pelas dicas, e obrigado pelas futuras dicas ajudas, correções etc... so uma OBS o trabalho e pra hoje anoite se alguém puder dar uma forcinha ainda essa tarde eu agradeço muito.

Link para o comentário
Compartilhar em outros sites

  • 0
Eu postei o código corrigido, se é que você não reparou.

puts amigo desculpas! e obrigado pelas dicas!!! se deu uma forçona! obrigado!

Amigo sem querer abusar, mais e q como tenho q apresentar preciso saber porque você tiro o gets e uso esse %30s

scanf("%30s",&pes.nome);

obrigado!

Editado por raphael monteiro
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...