<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Schrittweise Abarbeitung von Baumstruktur]]></title><description><![CDATA[<p>Ich habe eine einfache Baumstruktur, bei der jeder Knoten n Kinder haben kann und auf diese verweist. Es ist ein Syntaxbaum zur Darstellung eines mathematischen Ausdrucks (ähnlich S-Expression in Lisp) mit ein paar einfachen Operatoren, wie +, -, * usw. sowie Zahlenwerte.</p>
<p>z.B.: (+ (- 20 10) 50)</p>
<p>Die Struktur auszuwerten ist sehr einfach, indem ich von jedem Knoten rekursiv die evaluate()-Funktion für jedes seiner Kinder aufrufe und das Ergebnis an den Elter zurückgebe.<br />
Nun das Problem. Ich muß die Abarbeitung schrittweise vornehmen können, also anstatt (pseudocode):</p>
<pre><code>int result = root.evaluate();
</code></pre>
<p>muß etwas sein wie:</p>
<pre><code>while(...)
{
  int resultOfNode = tree.evaluateNext();
}
</code></pre>
<p>Ich habe eine halbfertige Lösung, indem ich den Stack einer Rekursion nachbilde,<br />
alle Knoten nacheinander auf ihn ablege und sobald einer evaluiert werden kann dies tue. Dazu gibt es zwei Stacks, einen für die Funktionen, einen für die Zahlenwerte:</p>
<pre><code>1. solange Knoten zum evaluieren wiederhole:
2. nächster Knoten == Funktion? 
3. ja: pack Knoten auf FunktionsStack
4. nein: pack Knoten auf WerteStack
5. Kann Knoten evaluiert werden?
6. ja: nimm (entferne) n-Argumente von WerteStack, nimm Funktion von Funktionsstack, evaluiere und pack Ergebnis zurück auf 
7. nein: zurück zu 2.
</code></pre>
<p>Hier ist aber der kritische Punkt in Zeile 5.: Wie erkenne ich, dass ein Knoten evaluiert werden kann? Erst dachte ich, es würde reichen zu sagen<br />
Wenn so viele Werte auf dem WerteStack liegen, wie die letzt abgelegte Funktion auf dem Funktionsstack Argumente hat, dann evaluiere sie. Das ist aber leider falsch.<br />
Hat jemand einen Vorschlag?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/160547/schrittweise-abarbeitung-von-baumstruktur</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 15:41:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/160547.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Sep 2006 19:13:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Schrittweise Abarbeitung von Baumstruktur on Tue, 26 Sep 2006 19:13:53 GMT]]></title><description><![CDATA[<p>Ich habe eine einfache Baumstruktur, bei der jeder Knoten n Kinder haben kann und auf diese verweist. Es ist ein Syntaxbaum zur Darstellung eines mathematischen Ausdrucks (ähnlich S-Expression in Lisp) mit ein paar einfachen Operatoren, wie +, -, * usw. sowie Zahlenwerte.</p>
<p>z.B.: (+ (- 20 10) 50)</p>
<p>Die Struktur auszuwerten ist sehr einfach, indem ich von jedem Knoten rekursiv die evaluate()-Funktion für jedes seiner Kinder aufrufe und das Ergebnis an den Elter zurückgebe.<br />
Nun das Problem. Ich muß die Abarbeitung schrittweise vornehmen können, also anstatt (pseudocode):</p>
<pre><code>int result = root.evaluate();
</code></pre>
<p>muß etwas sein wie:</p>
<pre><code>while(...)
{
  int resultOfNode = tree.evaluateNext();
}
</code></pre>
<p>Ich habe eine halbfertige Lösung, indem ich den Stack einer Rekursion nachbilde,<br />
alle Knoten nacheinander auf ihn ablege und sobald einer evaluiert werden kann dies tue. Dazu gibt es zwei Stacks, einen für die Funktionen, einen für die Zahlenwerte:</p>
<pre><code>1. solange Knoten zum evaluieren wiederhole:
2. nächster Knoten == Funktion? 
3. ja: pack Knoten auf FunktionsStack
4. nein: pack Knoten auf WerteStack
5. Kann Knoten evaluiert werden?
6. ja: nimm (entferne) n-Argumente von WerteStack, nimm Funktion von Funktionsstack, evaluiere und pack Ergebnis zurück auf 
7. nein: zurück zu 2.
</code></pre>
<p>Hier ist aber der kritische Punkt in Zeile 5.: Wie erkenne ich, dass ein Knoten evaluiert werden kann? Erst dachte ich, es würde reichen zu sagen<br />
Wenn so viele Werte auf dem WerteStack liegen, wie die letzt abgelegte Funktion auf dem Funktionsstack Argumente hat, dann evaluiere sie. Das ist aber leider falsch.<br />
Hat jemand einen Vorschlag?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1145062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1145062</guid><dc:creator><![CDATA[Serethos]]></dc:creator><pubDate>Tue, 26 Sep 2006 19:13:53 GMT</pubDate></item></channel></rss>