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

pilha


newnoob

Pergunta

pessoal, to precisando de uma ajuda , to fazendo um programa que utiliza pilhas, tenho que cria a função pra empilha,desempilha,verificar se a pilha esta vazia e verificar se o numero de parenteses da string estão balanceados, se puderem me ajudar eu agradeço, desde já muito obrigado

valeu

#include <stdio.h>
#include <stdlib.h>
#define TAM  100

typedef struct {
        int topo;
        char dado[TAM];
        }pilha_t;



char pop(pilha_t *pilha){
     if(*pilha.topo == -1){
          printf("pilha vazia");
          return;
          }else{
                pilha.topo--;
                return pilha.dado[pilha.topo + 1];
                }
     }

void push( pilha_t *pilha, char novo_elemento){
     if (*pilha.topo < TAM){
           pilha.topo++;
           pilha.dado[ilha.topo] = novo_elemento;
           }else{
                 printf("pilha cheia");
                 }
     return;
     }
boolean empty(pilha_t *pilha){
        if(*pilha.topo == -1){
                  return true;
                  }else{
                        return false;
                        }
        }

boolean balanced_parentheses(char *string){
        pilha_t pilha;
        int i;
        int cont = 0;
        while (*string != ''){
              for(i = 0; i < TAM; i++){
                    if(s[i] == '('){
                            cont ++;
                         }elseif(s[i] == ')'){
                                      cont--;
                                   }
                    if (cont < 0){
                             return false;
                             }
              }//for
              if(cont != 0){
                      return false;
                   }else{
                         return true;
                         }
        }//while
}
        

int main(){
    char *s;
    printf("Digite a expressao.\n");
    scanf("%s", &*s);
    if(balanced_parentheses(*s)){
         printf("Parenteses corretos");
         }else{
               printf("parenteses errados");
               }
    return 0;
}

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

#include <stdio.h>
#include <stdlib.h>
#define TAM  100

enum boolean { true=1, false=0 };

typedef enum boolean bool;

typedef struct {
        int topo;
        char dado[TAM];
        }pilha_t;



char pop(pilha_t *pilha){
     if(pilha->topo == -1){
          printf("pilha vazia");
          return;
          }else{
                pilha->topo--;
                return pilha->dado[pilha->topo + 1];
                }
     }

void push( pilha_t *pilha, char novo_elemento){
     if (pilha->topo < TAM){
           pilha->topo++;
           pilha->dado[pilha->topo] = novo_elemento;
           }else{
                 printf("pilha cheia");
                 }
     return;
     }
     
bool empty(pilha_t *pilha){
        if(pilha->topo == -1){
                  return true;
                  }else{
                        return false;
                        }
        }

bool balanced_parentheses(char *string){
        pilha_t pilha;
        int i;
        int cont = 0;
        while (string != ''){
              for(i = 0; i < TAM; i++){
                    if(string[i] == '('){
                            cont ++;
                         }else if(string[i] == ')'){
                                      cont--;
                                   }
                    if (cont < 0){
                             return false;
                             }
              }//for
              if(cont != 0){
                      return false;
                   }else{
                         return true;
                         }
        }//while
}
        

        

int main(){
    char s[TAM];
    printf("Digite a expressao.\n");
    gets(s);
    if(balanced_parentheses(s)== true){
         printf("Parenteses corretos\n");
         }else{
               printf("parenteses errados\n");
               }
    system("pause");
    return 0;
}

Basicamente lembre-se do seguinte... Em struct, quando você está trabalhando com ponteiro para struct, você usa o ->, e não o ".".

No for em 1 vetor de chars, o último caracter é o ''.

O tipo boolean não existe em c, portanto, se você pretende utilizá-lo, você precisa primeiro defini-lo.

O comando else-if tem espaço... "else if".

PS: Não entendi o para que da pilha, já que você não a utilizou em nada.

anw, att. Natan.

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

  • 0

andei dando uma revizada no programa coloquei as setas, agora ele já ta compilando, mas na hora que eu digito aparece um erro que o programa precisa ser fechado, o programa serve para verificar se o numero de parenteses da string esta certo ou não, vo posta o codigo refeito aqui pra verem.

se puderem me da uma ajuda eu agradeço

obrigado.

#include <stdio.h>
#include <stdlib.h>
#define TAM  100

typedef struct {
        int topo;
        char dado[TAM];
        }pilha_t;



char pop(pilha_t *pilha){
     if(pilha -> topo == -1){
          printf("pilha vazia");
          return 1;
          }else{
                pilha -> topo--;
                return pilha -> dado[pilha -> topo + 1];
                }
     }

void push( pilha_t *pilha, char novo_elemento){
     if (pilha -> topo < TAM){
           pilha -> topo++;
           pilha -> dado[pilha -> topo] = novo_elemento;
           }else{
                 printf("pilha cheia");
                 }
     return;
     }
bool empty(pilha_t *pilha){
        if(pilha -> topo == -1){
                  return true;
                  }else{
                        return false;
                        }
        }
        
bool balanced_parentheses(char *string){
        pilha_t pilha;
        int i;
        int cont = 0;
        while (string != ''){
              for(i = 0; i < TAM; i++){
                    if(string[i] == '('){
                            cont ++;
                         }else if(string[i] == ')'){
                                      cont--;
                                   }
                    if (cont < 0){
                             return false;
                             }
              }
              if(cont != 0){
                      return false;
                   }else{
                         return true;
                         }
        }
}

int main(){
    char *string;
    printf("Digite a expressao!\n");
    scanf("%s", &string);
    if(balanced_parentheses(string)){
         printf("Parenteses corretos");
         }else{
               printf("parenteses errados");
               }
    system ("pause");
    return 0;
}

Link para o comentário
Compartilhar em outros sites

  • 0

andei dando uma revizada no programa coloquei as setas, agora ele já ta compilando, mas na hora que eu digito aparece um erro que o programa precisa ser fechado, o programa serve para verificar se o numero de parenteses da string esta certo ou não, vo posta o codigo refeito aqui pra verem.

se puderem me da uma ajuda eu agradeço

obrigado.

#include <stdio.h>
#include <stdlib.h>
#define TAM  100

typedef struct {
        int topo;
        char dado[TAM];
        }pilha_t;



char pop(pilha_t *pilha){
     if(pilha -> topo == -1){
          printf("pilha vazia");
          return 1;
          }else{
                pilha -> topo--;
                return pilha -> dado[pilha -> topo + 1];
                }
     }

void push( pilha_t *pilha, char novo_elemento){
     if (pilha -> topo < TAM){
           pilha -> topo++;
           pilha -> dado[pilha -> topo] = novo_elemento;
           }else{
                 printf("pilha cheia");
                 }
     return;
     }
bool empty(pilha_t *pilha){
        if(pilha -> topo == -1){
                  return true;
                  }else{
                        return false;
                        }
        }
        
bool balanced_parentheses(char *string){
        pilha_t pilha;
        int i;
        int cont = 0;
        while (string != ''){
              for(i = 0; i < TAM; i++){
                    if(string[i] == '('){
                            cont ++;
                         }else if(string[i] == ')'){
                                      cont--;
                                   }
                    if (cont < 0){
                             return false;
                             }
              }
              if(cont != 0){
                      return false;
                   }else{
                         return true;
                         }
        }
}

int main(){
    char *string;
    printf("Digite a expressao!\n");
    scanf("%s", &string);
    if(balanced_parentheses(string)){
         printf("Parenteses corretos");
         }else{
               printf("parenteses errados");
               }
    system ("pause");
    return 0;
}

Link para o comentário
Compartilhar em outros sites

  • 0

não sei bem se éerro na compilação,na hora que aparece o executavel pragente digita tudo bem, mas depois que a gente digita e aperta enter ele não diz se esta certo ou errado o numero de paranteses e aparece que foi encontrado um erro e o programa precisa ser fechado.

Link para o comentário
Compartilhar em outros sites

  • 0

Saudações,

Uns dos motivos de seu programa estar travando durante a execução está na leitura da expressão.

Na função "balanced_parentheses" o loop "while" está sem incremento (loop infinito). O loop "for" faz exatamente o que você queria fazer com o "while" (não da melhor forma, mas percorre toda a expressão).

Para resolver o problema da leitura da expressão faça algo mais simples como:

char *string = "())";
Ou ainda:
char expressao[TAM];

printf("Digite a expressao!\n");
scanf ("%s", &expressao);
Na chamada da função poderá utilizar (com ponteiro):
string = &expressao[0];
if(balanced_parentheses(string))
Ou ainda, sem a utilização do ponteiro:
if (balanced_parentheses (&expressao[0]))

Espero ter ajudado. ;)

Abraços,

William Rodrigues.

Editado por William Rodrigues
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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...