2015-10-25 5 views
0

Я работаю над проектом, чтобы преобразовать из нотации записи, в, полностью вложенную в нотацию инфиксную нотацию. Проблема, которую я имею, оно печатает/хранит в обратном порядке он печатает как:Postfix для инфикса со стеками.

For line: QQ= 
(Q=Q) 


For line: ABC*D+* 
((D+(C*B))*A) 


For line: AB+CD+EF%G--* 
(((G-(F%E))-(D+C))*(B+A)) 


For line: NT^G*NN+# 
((N+N)#(G*(T^N))) 


For line: A 
A 


For line: ABC*D+* 
((D+(C*B))*A) 

мой код, который считывает данные в это:

void ReadData(string inString, ifstream& in) 
{ 
    if (in.is_open()) 
    { 
     stack<string> postToIn; 

     for (unsigned int i = 0; i< inString.length(); i++) 
     { 
      if ((inString[i] != '+') && (inString[i] != '-') && (inString[i] != '/') && (inString[i] != '#') && 
       (inString[i] != '*') && (inString[i] != '%') && (inString[i] != '^') && (inString[i] != '=')) 
      { 
       string charac(1,inString[i]); 

       postToIn.push(charac); 
      } 
      else 
      { 
       string temp = ""; 
       temp += "("; 
       temp += postToIn.top(); 
       postToIn.pop(); 
       temp += inString[i]; 
       temp += postToIn.top(); 
       postToIn.pop(); 
       temp += ")"; 
       postToIn.push(temp); 
      }   
     } 


     while (!postToIn.empty()) 
     { 
      cout << postToIn.top(); 
      postToIn.pop(); 
     } 
     cout << endl;  
    } 
} 

Я не могу сказать, где в мой код меняет его. Я знаю, что стеки сначала выходят/занимаются. Любая помощь будет принята с благодарностью.

ответ

1

В верхней части стека будет самый последний операнд, который вы хотите с правой стороны. Текущая реализация помещает его в левую часть оператора.

  string temp = ""; 
      string temp2 = ""; 
      temp += "("; 
      temp2 += postToIn.top(); // This is the recent operand. This needs to go on the right of the operator in infix notation 
      postToIn.pop(); 
      temp += postToIn.top(); 
      postToIn.pop(); 
      temp += inString[i]; 
      temp += temp2; 
      temp += ")"; 
      postToIn.push(temp);