• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Gose

listar pilha

6 mensagens neste tópico

Boas pessoal.

Tenho uma duvida em C. Estou a desenvolver um trabalho para visualizar frases encriptadas. Tive de criar uma pilha pa visualizar o respectivo numero de ocorrencia de cada palavra k o ultilizador insere e verificar se essa msm palavra existe na pilha, mas está a dar-me alguns erros. o prog corre mas sempre que introduza uma nova palavra ela vai sp para a posição zero, coisa que n pode acontecer, e quando introduzo uma palavra para pesquisar diz sempre que ela não existe.

Se alguem me puder ajudar agradecia.

O codigo que tenho é o seguinte:

void imprime_pilha()
{
     int x = top;                     //saber o top para depois por o top como no inicio
     //char palavra[] = "";
     int i=0, j=0;
     for (i=top ; i>=0 ; i--) {
         //palavra = pilha[top];
         //strcat (palavra, pilha[top]);
         printf("Top: %d - %s\n", top, pilha[top]);
         top--;
     }
     top = x;
}

void pesquisa_palavras()
{
     char find_pal[20];
     int i;
     char op2[5];
     int cont;
     printf("\nInsira a palavra que pretende procurar\n");
     gets(find_pal);
     
     //for(top=0;top<=pilha[top];top++)
     for(i=0;i<top;i++)
     {
               //if((gets(pilha[top]) == find_pal))
               if(strcmp(find_pal,pilha[top]))      
                       cont++;
                       /*printf("|******************************************|");
                       printf("|--- Pesquisa e respectivas ocorrencias ---|");
                       printf("|******************************************|");
                       printf("A palavra %s existe na pilha\n",find_pal);
                       printf("A palavra esta posicionada na posicao %d da pilha\n",top);*/
     }
     if(cont>0)
     {
               printf("|******************************************|\n");
               printf("|--- Pesquisa e respectivas ocorrencias ---|\n");
               printf("|******************************************|\n\n");
               printf("A palavra %s existe na pilha\n",find_pal);                 
     }else if(cont<0){
                     top++;
                     printf("A palavra nao existe na pilha!!\n");
                     printf("Procure outra palavra...\n");

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

porque não usas um hash map para guardar as palavras ?

um hash map requer a ultilização de estruturas certo?

Não posso usar estruturas no trabalho..apenas pilhas e filas.

Não posso usar listas nem estruturas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim uma hash map é uma estrutura, mas também os são as stacks e quees (pilhas e filas), então é uma condição do trabalho usar apenas pilhas e filas ?

Até porque a forma como estás a usar a pilha ai, viola o interface de uma pilha...

uma pilha é caracterizada por permitir apenas 2 operações push e pop.

 
for (i=top ; i>=0 ; i--) {
         //palavra = pilha[top];
         //strcat (palavra, pilha[top]);
         printf("Top: %d - %s\n", top, pilha[top]);
         top--;
     }

De qualquer forma em resposta á tua pergunta o iterador (index)  que estás usar é o i ( for int i = ....)

no entanto ao acederes á tua "pilha" estás a usar top, ou seja neste pedaço de código estás sempre a comparar sempre no topo da pilha em vez de procurares na pilha toda pela palavra pedida

  for(i=0;i<top;i++)
     {
               //if((gets(pilha[top]) == find_pal))
               if(strcmp(find_pal,pilha[top]))      

assim á primeira vista é um dos erros lógicos que encontro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim uma hash map é uma estrutura, mas também os são as stacks e quees (pilhas e filas), então é uma condição do trabalho usar apenas pilhas e filas ?

Até porque a forma como estás a usar a pilha ai, viola o interface de uma pilha...

uma pilha é caracterizada por permitir apenas 2 operações push e pop.

 
for (i=top ; i>=0 ; i--) {
         //palavra = pilha[top];
         //strcat (palavra, pilha[top]);
         printf("Top: %d - %s\n", top, pilha[top]);
         top--;
     }
[/Code]

De qualquer forma em resposta á tua pergunta o iterador (index)  que estás usar é o i ( for int i = ....)
no entanto ao acederes á tua "pilha" estás a usar top, ou seja neste pedaço de código estás sempre a comparar sempre no topo da pilha em vez de procurares na pilha toda pela palavra pedida
[Code]
  for(i=0;i<top;i++)
     {
               //if((gets(pilha[top]) == find_pal))
               if(strcmp(find_pal,pilha[top]))      
[/Code]

 assim á primeira vista é um dos erros lógicos que encontro.

Sim é uma condição do trabalho usar apenas pilhas e filas, mas sem estruturas as pilhas.
Com estruturas já encontrei bastantes exemplos em como poderia fazer mas sem estruturas não ha praticamente nada.
Sim eu sei que viola, mas então sem estruturas como é que era possivel fazer a pilha?
Acho que já resolvi um dos erros com essa dica que me deste.
Outra coisa..consegues dizer-me porque é que quando insiro a frase só me empilha a 1ra palavra da frase? eu queria que empilha-se todas(uma a uma) e n tou a conseguir ver onde está o erro.
[code=c]

char palavra[50];
     //char palavraFinal[] = "";
     int tamanho=0, tamanho2=0, tamanho3=0;
     int z=0,i,y=0;
     
     gets(frase);
     tamanho = strlen(frase);
     
     printf("%d\n\n",tamanho);
     for(i=0 ; i<tamanho ; i++) //percorre a frase toda ate ao fim
     {
             if(frase[i]==' ') {
                         tamanho2 = strlen(palavra);
                         printf("tamanho da palavra antes do respectivo espaco: %d\n", tamanho2);
                         /*if(frase[i]>' ') {
                                  tamanho3 = strlen(palavra);
                                  printf("tamanho da palavra dps do 1ro espaço: %d\n",tamanho3);
                                  }*/
                                  
                         Push(palavra);
                         imprime_pilha();
                         for (y=0 ; y <= 50 ; y++) //serve para apagar a palavra que está antes de ter encontrado o espaco.
                         {
                             palavra[y] = '\0';
                         }
                         z=0; //se tirar isto imprime a frase toda mas sem espaço
                         pesquisa_palavras();
                         
             } else {
                    palavra[z] = frase[i];
                    puts(palavra);
                    z++;
             }
Push (void *pal)
{
          if( top >= N ) // pilha cheia
                    printf("\n pilha cheia\n");
          else {
                    printf("\n");
                    printf("|*********************|\n");
                    printf("|- Insercao na pilha -|\n");
                    printf("|*********************|\n");
                    printf("Vou inserir: %s\n",pal);
                    top++;
                    pilha[top] = pal;
                    printf("Inseri: %s\n", pilha[top]);
                    printf("Palavra inserida com sucesso na pilha\n");
        }
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

2 coisas que estou a ver mal

1º:

O strlen funciona por contar o numero de caracteres até encontrar um '\0', e tu logo na primeira iteração estás a substituir a primeira palavra por '\0's  por exemplo

"isto e uma frase blah blah"    o que estás a fazer é alterar a frase para "\0\0\0\0 e uma frase blah blah" logo na segunda iteração o strlen devolve 0 de comprimento....

2º na função push recebes por referencia (apontador) o endereco inicial da tua palavra e estás a fazer o que se chama uma shallow copy 

pilha[top] = palavra

logo em seguida no teu ciclo for estás a alterar essa mesma palavra como referido acima para '\0\0\0\0'

o que precisas de fazer é uma das 2 soluções

ou n alteras a palavra inicial, ou copias por valor usando strcpy

espero ter ajudado n estou c mt tempo se mesmo assim tiveres duvidas mais tarde ajudo.te de kk forma tens umafunção excelente para isso chamada strtok

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora