Jump to content

listar pilha


Gose
 Share

Recommended Posts

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");
Link to comment
Share on other 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.

Link to comment
Share on other 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");
        }
}
Link to comment
Share on other 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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.