Ich finde die Stack-Variante durchaus sinnvoll. Bei Blocks 5 verwende ich einen Stack
Damit kann man schöne Sachen machen: wenn ich aus dem Spiel heraus in die Optionen gehe, werden die Optionen einfach oben drauf gepusht. Der Spielzustand bleibt darunter erhalten, wird aber nicht aktualisiert. Bin ich in den Optionen fertig (Pop), komme ich automatisch wieder zurück zum Spiel. Und wenn ich aus dem Hauptmenü heraus in die Optionen gekommen bin, dann komme ich wieder ins Hauptmenü zurück.
Man muss auch nicht immer Push/Pop machen, manchmal ist es auch sinnvoll den obersten Zustand durch einen anderen zu ersetzen (wenn es kein logisches "Zurück" gibt, z.B. vom Ladebildschirm ins Spiel hinein - es macht keinen Sinn später nochmal zum Ladebildschirm zurückzugehen). Tut man das immer, dann hat man genau die gleiche "Mächtigkeit" wie ein endlicher Automat bzw. ein klassischer State-Manager. Wenn man will, hat man aber auch mehr. Unendliches Anwachsen wird in der Praxis nicht passieren.
Hier noch ein Link zu einem Artikel, der es auch mit einem Stack umsetzt:
http://gamedevgeek.com/tutorials/managing-game-states-in-c/