Infix à postfix de conversion à l'aide de piles (listes chaînées en C++
Bonne journée à tous! Je suis nouveau en C++ (et ici en stackoverflow) et j'ai besoin de l'aide auprès de vous des experts. Il y a quelque chose de mal avec ce code, même si il n'y a pas d'erreur ou d'avertissement. Il se bloque à chaque fois que le programme est en cours d'exécution.
Le programme convertit infix à postfix, à l'aide de listes liées (les piles).
# include <iostream>
# include <cstring>
using namespace std;
struct node {
char data;
node *next;
};
node *top=NULL;
node *bottom=NULL;
node *entry;
node *last_entry;
node *second_last_entry;
void push(const char Symbol) {
entry=new node;
if(bottom==NULL) {
entry->data=Symbol;
entry->next=NULL;
bottom=entry;
top=entry;
}
else {
entry->data=Symbol;
entry->next=NULL;
top->next=entry;
top=entry;
}
}
const char pop( ) {
char Symbol=NULL;
if(bottom==NULL)
cout<<"\n\n\n\t *** Error : Stack is empty. \n"<<endl;
else {
for (last_entry=bottom; last_entry->next!=NULL; last_entry=last_entry->next)
second_last_entry=last_entry;
if(top==bottom)
bottom=NULL;
Symbol=top->data;
delete top;
top=second_last_entry;
top->next=NULL;
}
return Symbol;
}
void infix_to_postfix(const char *Infix) {
char Infix_expression[100]={NULL};
char Postfix_expression[100]={NULL};
strcpy(Infix_expression,"(");
strcat(Infix_expression,Infix);
strcat(Infix_expression,")");
char Symbol[5]={NULL};
char Temp[5]={NULL};
for(int count=0;count<strlen(Infix_expression);count++) {
Symbol[0]=Infix_expression[count];
if(Symbol[0]=='(')
push(Symbol[0]);
else if(Symbol[0]==')') {
Symbol[0]=pop( );
while(Symbol[0]!='(')
{
strcat(Postfix_expression,Symbol);
Symbol[0]=pop( );
}
}
else if(Symbol[0]=='^' || Symbol[0]=='*' || Symbol[0]=='/'
|| Symbol[0]=='+' || Symbol[0]=='-')
{
if(Symbol[0]=='*' || Symbol[0]=='/')
{
Temp[0]=pop( );
while(Temp[0]=='^' || Temp[0]=='*' || Temp[0]=='/')
{
strcat(Postfix_expression,Temp);
Temp[0]=pop( );
}
push(Temp[0]);
}
else if(Symbol[0]=='+' || Symbol[0]=='-')
{
Temp[0]=pop( );
while(Temp[0]!='(')
{
strcat(Postfix_expression,Temp);
Temp[0]=pop( );
}
push(Temp[0]);
}
push(Symbol[0]);
}
else
strcat(Postfix_expression,Symbol);
}
cout<<"\n\n Postfix Expression : "<<Postfix_expression;
}
int main( ) {
char Infix_expression[100]={NULL};
cout<<"\n\n Enter the Infix Expression : ";
cin>>Infix_expression;
infix_to_postfix(Infix_expression);
return 0;
}
S'il vous plaît aidez-moi! Je suis un débutant et je ne peux pas aller loin sans vous les gars. Merci beaucoup!
- Savez-vous comment faire pour exécuter votre code dans un débogueur ?
- Je crains que non. J'utilise codeblocks par la voie.
- Je suppose que vous avez besoin d'apprendre comment déboguer avant de réellement résoudre ce problème.
- Votre code semble assez étrange (au moins, il pourrait certainement profit de plusieurs méthodes d'assistance et de restructuration). Je suppose que vous avez lu le de manœuvre de triage de l'article sur le wiki?
Vous devez vous connecter pour publier un commentaire.
Je suppose que l'aide dont vous avez besoin est d'apprendre à déboguer le code à l'aide de ce que l'IDE. La première chose que vous pouvez essayer est d'ajouter plus de l'impression (via
cout
) pour voir ce qu'il se passe un peu plus clair et de vous trouver où le programme se bloque (ou s'il est bloqué dans une boucle infinie).Ici est un tutoriel pour montrer comment le débogage à l'aide de codeblocks. Malheureusement je n'ai aucune idée si cela va correspondre à votre configuration si.
Pour une pile vous avez seulement besoin un pointeur de pile.
Devrait permettre de résoudre certaines erreurs, mais probablement pas tous. Parfois, j'ai vu la même chose fait avec deux piles: une pour les opérateurs, l'un pour les opérandes. Je n'ai pas nécessairement l'informer que. Plutôt commencer à partir de zéro, et de garder l'algorithme simple et abstrait, peut-être en pseudo-code en premier.