2015-03-27 3 views
6

Das ist wirklich interessant, weil unser Lehrer uns das gestern beigebracht hat und er es selbst nicht herausfinden konnte. Also hängen wir irgendwie daran, ohne den tatsächlichen Grund zu kennen. HierWarum ein Array der Größe 1 mehr als die angeforderte Größe zuweisen?

ist die Array-Implementierung einer Queue in einem berühmten Buch (was ich nicht habe, aber das ist, was mein Lehrer sagte der Autor ist sehr renommiert.):

class QUEUE { 
private: 
    int* q; 
    int N; 
    int head; 
    int tail; 
public: 
    QUEUE(int maxN) { 
     q = new int[maxN + 1]; 
     N = maxN + 1; head = N; tail = 0; 
    } 
    int empty() const { 
     return head % N == tail; 
    } 
    void put(int item) { 
     q[tail++] = item; tail = tail % N; 
    } 
    int get() { 
     head = head % N; return q[head++]; 
    } 
}; 

Innerhalb des Konstruktor , sehen Sie q = new int[maxN + 1];. Aber warum die '+ 1'? Warum reserviert er einen zusätzlichen int-Speicherblock?

+0

Das Buch ist von Robert Sedgewick BTW. –

Antwort

6

Das Problem, das man maxN löst das Hinzufügen ist, dass, wenn Sie genau maxN Elemente zuweisen, würden Sie nicht in der Lage sein, diese zwei Situationen zu unterscheiden:

  • Die Warteschlange leer ist, und
  • Die Warteschlange hat genau maxN Artikel.

In diesen beiden Situationen head und tail würde zueinander Modulo N gleich sein.

Hinweis: Die Implementierung ist nicht ideal, da das Einfügen von maxN+1 -ten Element die Warteschlange umschließt, so dass es wieder leer wird. Dieser Mangel kann auf drei Arten behandelt:

  • Wurf eine Ausnahme, wenn Warteschlange überläuft,
  • Wechsel Rückgabe Typ bool, -insertionen ignorieren, dass die Warteschlange überläuft, und das Rück false wenn eine Insertion ignoriert wird, oder
  • Insertionen ignorieren, die die Warteschlange überlaufen lassen (nicht empfohlen).
+0

kann auf diese Weise gemacht werden, ist aber nicht das, was obige Implementierung imo: http://ideone.com/LWsmZi Nach x: (x% n + 1 == 0) Einfügungen, leer() wird wahr zurückgegeben. Die Einfügerichtlinie ist auch sehr merkwürdig, da sie von vorne überschreibt, ohne den Kopf anzupassen, wenn mehr als N Elemente eingefügt werden. Also ist seine Drop-Strategie irgendwie zufällig. – midor

+0

Ok, wenn Sie also der Implementierung dieses Autors folgen, wie würden Sie überprüfen, ob die Warteschlange voll ist? Ich weiß, wie auf meine Umsetzung, aber hier bin ich mir nicht sicher. –

+0

@KaneWilliamson Wie folgt: 'bool full() const {return ((head + 1)% N == schwanz);}' – dasblinkenlight

Verwandte Themen