2012-03-18 77 views
1

美好的一天,每个人!我是C++新手(在这里也是在stackoverflow),我需要你的专家帮助。即使没有错误或警告,此代码也有问题。它只是在程序执行时挂起。

该程序使用链接列表(堆栈)将中缀转换为后缀。在C++中使用堆栈(链表)插入后缀转换

# 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; 
} 

请帮帮我!我是一个新手,如果没有你们,我不会走得太远。非常感谢你!

+1

你知道如何在调试器中运行你的代码吗? – 2012-03-18 13:30:09

+0

恐怕不是。顺便说一句,我正在使用代码块。 – 2012-03-18 13:31:47

+4

我想你需要在实际解决这个问题之前学习如何调试。 – 2012-03-18 13:42:55

回答

1

我想你需要的帮助是学习如何使用该IDE调试代码。您可以尝试的第一件事是添加更多打印(通过cout)以更清晰地查看发生了什么,并找到程序挂起的位置(或者它是否陷入无限循环)。

Here是一个教程,展示如何使用代码块进行调试。可悲的是我不知道这是否会符合你的配置。

+0

谢谢J.N.!但是我使用的代码块只是免费下载的,我无法访问构建选项来调试代码。 – 2012-03-18 13:54:41

+0

@FirstLady你真的应该使用允许调试的IDE。但看着代码块的Wikipage ..它是在GPL下发布的,所以我不太了解你的观点。无论如何,还有日食CDT(崇尚* nix,windows,不知道mac)和VS表达窗口。 – Voo 2012-03-18 14:04:10

+0

谢谢,Voo!我会寻找日食CDT。谢谢! :) – 2012-03-18 14:10:50

1

对于一个堆栈,你只需要一个堆栈指针。

void push(const char Symbol) { 
    entry = new node; 
    entry->data = Symbol; 
    entry->next = top; 
    top = entry; 
} 


const char pop() { 
    if (!top) { 
     cout << "\n\n\n\t *** Error : Stack is empty. \n" << endl; 
     return ' '; 
    } 
    node* entry = top; 
    top = top->next; 
    char ch = entry->data; 
    delete entry; 
    return ch; 
} 

const bool is_empty() { 
    return !top; 
} 

这应该解决一些错误,但可能不是全部。有时我看到两个堆栈完成相同的事情:一个用于操作符,另一个用于操作数。我不一定建议。从零开始,并保持算法简单和抽象,可能首先使用伪代码。

+0

嘿它现在工作!非常感谢Joop Eggen!更多的祝福!非常感谢! – 2012-03-18 14:10:18