Wyświetlanie drzewa wyrażeń arytmetycznych uwzględniając priorytet operatorów (używając nawiasów)

0

Hej!
Utknęłam i nie wiem co zrobić, mam klasę, która zawiera wskaźnik na korzeń drzewa liczb i operatorów arytmetycznych i chciałabym je wyświetlić ale uwzględniając priorytet operatorów. Jak mogłabym to zrobić?
Załóżmy, że mamy, np. taki przypadek:

        +
     /    \
   +       9
 /    \
2      *
     /   \
    5     4

Chciałabym aby wyrażenie zostało wyświetlone w taki sposób: (2+(5*4))+9).
Pozdrawiam i z góry dziękuję za jakiekolwiek pomysły bo kombinowałam na różne sposoby przenosiłam wyświetlanie w różne miejsca,dawałam różne warunki i nic :(

void Interpreter::printTree(std::unique_ptr<AbstractExpression>& root)
{
	if (root)
	{
		
		printTree(root->getLeftNode());

		std::cout << root->emit();
		
	        printTree(root->getRightNode());
	}
}
1
void Interpreter::printTree(const std::unique_ptr<AbstractExpression>& root)
{
	if (root)
	{
		bool show_parenthesis= root->getLeftNode() || root->getRightNode();

		if(show_parenthesis) std::cout << '(';

		printTree(root->getLeftNode());
		std::cout << root->emit();
		printTree(root->getRightNode());

		if(show_parenthesis) std::cout << ')';
	}
}

Nie pokazałaś, jakiego typu wartość zwraca metoda emit, dlatego nic przy tym nie robiłem (bo jeśli zwraca liczby i operatory, to trzeba jakoś je rozróżnić).

0

emit jest metodą wirtualną i zwraca stringa;

  • w przypadku liczby:
template<typename T>
std::string Number <T>::emit()
{
	return std::to_string(this->getValue()); 
}
  • w przypadku operatora, np. dodawania:
std::string Addition::emit()
{
	return plus.getCharacter();
}

Kurczę działa!!! Bardzo, bardzo Ci dziękuję teraz już wiem dlaczego mi nie działało ja sama używałam zamiast sumy logicznej iloczynu:

if(root->getLeftNode()==nullptr && root->getRightNode()==nullptr)
std::cout<<"(";

i każda liczba była wtedy w nawiasie -,-
Jeszcze jedno pytanie bo aktualnie wyświetla: ((2+(5+4))+9) gdybym chciała się pozbyć najbardziej zewnętrznych nawiasów co musiałabym zmodyfikować? Swoją drogą zmiana:

 bool show_parenthesis= root->getLeftNode() || root->getRightNode();

na

 bool show_parenthesis= root->getLeftNode() && root->getRightNode();

nie powoduje żadnej zmiany w wyświetlaniu...
Pozdrawiam A

1

co musiałabym zmodyfikować?

Coś w ten deseń:

void Interpreter::printTree(const std::unique_ptr<AbstractExpression>& root, bool is_root = true)
{
	if (root)
	{
		bool show_parenthesis = (root->getLeftNode() || root->getRightNode()) && !is_root;

        if(show_parenthesis) std::cout << '(';

		printTree(root->getLeftNode(), false);
		...
		printTree(root->getRightNode(), false);
		...

Swoją drogą zmiana: (...)

nie powoduje żadnej zmiany w wyświetlaniu...

Nie powoduje, bo operator zawsze ma dwa argumenty ;)

0

I wszystko jasne :D jeszcze raz bardzo dziękuję!

1 użytkowników online, w tym zalogowanych: 0, gości: 1