2012-03-18 42 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