2013-07-06 73 views
0

這裏是我的代碼,使用分流碼將中綴轉換爲ron。我知道該算法的工作原理,我沒有問題。 但是當我運行這只是沒有發生。 當我調試它,我得到未知錯誤的堆棧初始化線將中綴轉換爲Rpn(分流碼)

#include <iostream> 
#include <string> 
#include <cstring> 
#include <cstdlib> 
#include <stack> 
using namespace std ; 
void convert (char *) ; 
double eval(char *) ; 
int precedence(char); 

int main() { 

cout << "\n Enter an expression :\n" ; 
cout << " >> " ; 
char input[51] ; 
cin.get(input,50); 
convert (input) ; 
system("PAUSE"); 

} 
int precedence(char op) { 
    switch (op) { 
    case '-' : case '+' : 
     return 1 ; 

    case '*' : case '/' : 
     return 2 ; 

    case '^' : 
     return 3 ; 

    default : 
     return 0 ; 

    } 

} 

    void convert(char* exp) { 
    stack <char> stc; 
    string outputQueue ; 
// string temp ; 
while (*exp) { 

while (isspace(*exp)){ 
    *exp++ ; 
} 

if (*exp == '(') { 
     stc.push(*exp++) ; 
    } 
else if (*exp == ')'){ 
    while (stc.top()!='(') { 
      outputQueue += stc.top() ; 
      stc.pop(); 
      *exp++; 
      } 
      stc.pop() ; /** Havaset bashe */ 
} 
else if (isdigit(*exp)){ 
    while (isdigit(*exp)) { 
     outputQueue += *exp++ ; 
    } 
    outputQueue += " " ; 

} 
else if (strchr("+-*/^",*exp)) { 
     if (precedence(*exp) > precedence(stc.top())) { 
       stc.push(*exp++) ; 
     } 
     else { 
      if (precedence (*exp) == precedence (stc.top()) && precedence(*exp) == 3) { 
       stc.push(*exp++) ; 
      } 
      else { 
       outputQueue += stc.top() ; 
       outputQueue += ' ' ; 
       stc.pop(); 
      } 
     } 

} 
} 

while (!stc.empty()) { 
    outputQueue =+ stc.top() ; 
    stc.pop(); 
} 
cout << outputQueue ; 
} 

回答

0

我不知道你的意思,我修改代碼。 在2行中,您嘗試獲取空堆棧的頂層元素。這產生了斷言。

#include <iostream> 
#include <string> 
#include <cstring> 
#include <cstdlib> 
#include <stack> 
using namespace std ; 
void convert (char *) ; 
double eval(char *) ; 
int precedence(char); 

int main() 
{ 
    cout << "\n Enter an expression :\n" ; 
    cout << " >> " ; 
    char input[51] ; 
    cin.get(input,50); 
    convert (input) ; 
    system("PAUSE"); 
} 

int precedence(char op) 
{ 
    switch (op) 
    { 
     case '-' : 
     case '+' : 
      return 1 ; 

     case '*' : 
     case '/' : 
      return 2 ; 

     case '^' : 
      return 3 ; 

     default : 
      return 0 ; 
    } 
} 

void convert(char* exp) 
{ 
    stack <char> stc; 
    string outputQueue ; 

    while (*exp) 
    { 
     while (isspace(*exp)) 
     { 
      *exp++ ; 
      } 

     if (*exp == '(') 
     { 
      stc.push(*exp++) ; 
     } 
     else if (*exp == ')') 
     { 
      while (stc.top()!='(') 
     { 
      outputQueue += stc.top() ; 
      stc.pop(); 
      *exp++; 
     } 
     stc.pop() ; /** Havaset bashe */ 
     } 
     else if (isdigit(*exp)) 
     { 
      while (isdigit(*exp)) 
     { 
      outputQueue += *exp++ ; 
     } 
     outputQueue += " " ; 
     } 
     else if (strchr("+-*/^",*exp)) 
     { 
      if (precedence(*exp) > precedence(stc.top())) 
     { 
      stc.push(*exp++) ; 
     } 
     else 
     { 
      if (precedence (*exp) == precedence (stc.top()) && precedence(*exp) == 3) 
      { 
       stc.push(*exp++) ; 
      } 
      else 
      { 
       outputQueue += stc.top() ; 
      outputQueue += ' ' ; 
      stc.pop(); 
      } 
     } 
     } 
    } 

    while (!stc.empty()) 
    { 
     outputQueue =+ stc.top() ; 
     stc.pop(); 
    } 
    cout << outputQueue ; 
}