2009-12-09 4 views
2

J'essaye d'implémenter le préfixe pour infixer en C++, c'est ce que j'ai jusqu'ici. L'entrée doit être par exemple quelque chose comme ceci:préfixe à infixe sur la pile

/7+23 

Et le ouput:

7/(2+3) or (7/(2+3)) 

Mais au lieu que je reçois:

(/) 

C'est le code que j'ai écrit jusqu'à présent:

void pre_to_in(stack<char> eq) { 
    if(nowe.empty() != true) { 
     char test; 
     test = eq.top(); 
     eq.pop(); 
     if(test == '+' || test == '-' || test == '/' || test == '*') { 
      cout << "("; 
      pre_to_in(eq); 
      cout << test; 
      pre_to_in(eq); 
      cout << ")"; 
     } else { 
      cout << test; 
     } 
    } 
} 


// somewhere in main() 
char arr[30]; 
stack<char> stosik; 
int i = 0; 
cout << "write formula in prefix notation\n"; 
cin >> arr; 

while(i < strlen(arr)) { 
    stosik.push(arr[i]); 
    i++;   
} 
pre_to_in(stc); 
+1

Est-ce que ce sont les devoirs? Si oui, identifiez-le comme tel. –

+3

Merci d'avoir d'abord essayé le problème, puis de nous avoir montré toutes les informations dont vous disposez. * Merci. * – GManNickG

+2

Voulez-vous dire de copier en valeur, ou avez-vous oublié un &, par exemple: pre_to_in (pile & eq)? – Mic

Répondre

0
cin >> arr; 

lit seulement un "mot" d'entrée, pas une ligne entière. Ici, il n'y a que le premier caractère de barre oblique.

+0

Accusez-moi, j'ai ajouté des espaces supplémentaires pour clarifier l'entrée et la sortie. Question corrigée Ce n'est pas une solution, malheureusement. – blid

1
  1. Ceci est une pile. Premier entré dernier sorti. Vous avez besoin d'une chaîne d'entrée inversée "32 + 7 /".

  2. Vous utilisez plusieurs piles. Dans chaque entrée to pre_to_in() stack est copié. Utilisez référence ou pointeur, ex: void pre_to_in(stack<char> &eq);

C'est tout.

P.S. Les noms Unifier (s/Nowe/eq/g & & s/SQC/Stosik/g)

+0

Ad.1. Voir http://pl.wikipedia.org/wiki/Odwrotna_notacja_polska Ad.2. Voir http://pl.wikibooks.org/wiki/C%2B%2B/Referencje Les deux sites en polonais. – rysson

0

ne sais pas si vous êtes à la recherche d'une telle solution, en tout cas pour l'entrée que vous l'avez mentionné donne la sortie que vous postez

il lit des jetons depuis l'entrée std

Je l'ai construit maintenant sous Visual studio 2005 - mettre fin à la presse d'entrée entrée, Ctrl + Z, entrée

mais sur d'autres terminaison compilateurs peut travailler d'une autre manière

#include <algorithm> 
#include <deque> 
#include <iostream> 
#include <string> 

typedef std::deque<std::string> tokens_t; 

void pre_to_in(tokens_t* eq) 
{ 
    if (!eq->empty()) { 
     const std::string token = eq->front(); 
     eq->pop_front(); 
     if ((token == "+") || (token == "-") || (token == "/") || (token == "*")) { 
      std::cout << "("; 
      pre_to_in(eq); 
      std::cout << token; 
      pre_to_in(eq); 
      std::cout << ")"; 
     } else { 
      std::cout << token; 
     } 
    } 
} 


int main() 
{ 
    std::cout << "write formula in prefix notation" << std::endl; 

    tokens_t tokens; 
    std::copy(
     std::istream_iterator<std::string>(std::cin), 
     std::istream_iterator<std::string>(), 
     std::back_inserter(tokens)); 

    pre_to_in(&tokens); 
}