Warteschlange verwendet einen Stack
Ich habe Probleme beim Verständnis einer Frage. Die Frage fragt der erste zu sein schreiben Sie eine C++ - Klasse zur Darstellung eines stack von ganzen zahlen, und dass viel getan wird. Hier sind meine Prototypen:
class Stack{
private:
int top;
int item[100];
public:
Stack() {top = -1;}
~Stack();
void push(int x) {item[++top] = x;}
int pop() {return item[top--];}
int empty(int top);
};
Den zweiten Teil der Frage sagt: "Mit dem stack für storage-Zwecke, schreiben Sie eine C++ Klasse zur Darstellung einer Warteschlange mit Integer". Meine queue ist wie folgt:
class Queue{
private:
int * data;
int beginning, end, itemCount;
public:
Queue(int maxSize = 100);
Queue(Queue &OtherQueue);
~Queue();
void enqueue(int x);
void dequeue();
int amount();
};
Ich verstehe nicht, wie ich bin gedacht, um verwenden einen stack für storage-Zwecke für eine Warteschlange.
- Die Frage scheint seltsam. Ein stack ist ein LIFO (last in, first out) Struktur, während eine Warteschlange der Regel ist FIFO (first in, first out) Struktur. Es sei denn, Sie implementieren müssen, um eine LIFO-Warteschlange ist es schwer zu verwenden einen stack.
- Verwandte: stackoverflow.com/questions/688276/...
- Ich glaube nicht, dass Sie gemeint haben, Ihren Stack Konstruktor wie Sie es haben. Vielleicht meintest du "Stack() {top = -1;}"?
- du hast Recht.
- was ist der Sinn dieser Seite, wenn nicht, Fragen zu stellen?
- Re:KM, Weil die einzige Antwort, die wir dir geben kann, ist die Zuordnung nicht sinnvoll ist. Sie können nicht verwenden Sie einen stack wie eine Schlange.
- Wir haben gesagt, dass dies über die Lehrer seit Jahren, aber die Lehrer es immer noch Aufgaben, die nicht sinnvoll sind. Glaube nicht, dass wird sich die Situation bald ändern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht einverstanden mit dem vorhandenen Antwort. In der Regel, eine Warteschlange First In First Out, während ein stack ist offensichtlich Last In, First Out. Ich kann mir nur denken, dass der eine Implementierung mit zwei stacks, knallen die ganze Sache und das hinzufügen alle, aber der Letzte Punkt auf den zweiten Stapel.
Scheint wie eine dumme Sache zu tun, aber ich denke, es ist für die Sache der übung. Wie unten kommentiert, ist es auch möglich, in abgeschrieben O(1), weil der zweite Stapel in der richtigen Reihenfolge. Sie können nur Elemente aus dem zweiten Stapel, bis Sie laufen aus, die Sie verschieben alles, was aus den ursprünglichen Stapel zu dem zweiten Stapel.
Einer FIFO-Warteschlange würde einfach sein, einen Stapel mit
Enqueue
wirdPush
undDequeue
wirdPop
. Das macht keinen Sinn als übung, also ich würde auf jeden Fall davon ausgehen, eine FIFO-Warteschlange vorgesehen war.Bearbeiten: Hinzugefügt einige links, etwas nicht einfach auf mein Handy 🙂
enqueue
unddequeue
Operationen: stackoverflow.com/questions/1294756/queue-that-uses-a-stack/...O(1)
. Aber es ist amortisierenO(1)
.O(1)
entweder. Sobald Sie füllen das array ist, müssen Sie den Puffer, dieO(n)
. Das ist wie eine hash-Tabelle.Nehmen Sie zwei Stapel, in und aus.
enqueue
ein element,push
es auf stack in.dequeue
ein element,pop
ein element vom stack aus wenn aus nicht leer ist; ansonstenpop
undpush
alle Elemente aus in zu aus, dann dienen Sie dem obersten element der aus.Ist es wichtig, dass Sie führen Sie Schritt 2 wenn erforderlich. Beachten Sie, dass
enqueue
hat Komplexität O(1), unddequeue
hat abgeschrieben Komplexität O(1), vorausgesetzt, dass Ihre Implementierungen vonpop
undpush
sind O(1).push
undpop
- Implementierungen, die haben O(1) Komplexität?Warteschlange die privaten Daten muss ein Stack. Mit, nur Sie können natürlich trivial
implementieren Sie eine LIFO-Warteschlange nur für eine FIFO-Warteschlange müssen Sie ZWEI Stapel -- zu zitieren
Hinweis für übung 10 in dieser hervorragenden Seite, "Hinweis: Wenn Sie push-Elemente auf einen stack und dann knallen Sie alle, erscheinen Sie in umgekehrter Reihenfolge. Wenn Sie wiederholen Sie diesen Prozess, Sie sind jetzt wieder in Ordnung."...
Natürlich wäre es nicht die empfohlene Art der Lagerung, da eine LIFO-und der andere ist FIFO.
Warteschlange, Sie würden schieben Sie Ihre integer auf den stack.
Zu entfernen, müssten Sie pop alle ganzen zahlen aus dem Stapel, das Letzte ganze Zahl, und schieben Sie alle anderen ganzen zahlen zurück auf den Stapel. Haben ein temporärer Stapel, wo Sie schieben alle Integer-zahlen, wie Sie knallen Sie ab, bekommen Sie Ihre Antwort, dann pop alle ganzen zahlen aus dem temporären stack wieder auf Ihre Haupt-Speicher.
Warteschlange mit stack? Sie benötigen 2-stacks, natürlich, das wäre ein O(n) queue-Implementierung.
Den Unterschied zwischen einem stack und einer Warteschlange einen Stapel, die Sie sowohl hinzufügen und entfernen von Elementen von der Spitze, während in einer Warteschlange, die Sie hinzufügen, an der Spitze, und entfernen Sie von der Unterseite. So implementieren Sie eine Warteschlange mit einem stack, der den enqueue-operation wird eine normale push auf den stack, während sich die dequeue-operation wird zu pop, den gesamten Stapel abrufen der letzten Position, dann schieben Sie alle Elemente auf den Stapel zurück. Sie müssen verwenden Sie einen anderen Stapel zum speichern der Elemente vorübergehend.
Ich vermute, dass die Absicht der Frage ist zunächst die Definition einer Klasse Stack wie du haben, die hat die Kapazität zum speichern von int-Werten.
dann deklarieren Sie eine Klasse geerbt von stack, Queue genannt, die der eigenen addtoqueue und servefromqueue Funktionen, verwendet aber die gleiche Speicher-Mechanismus als Stack.
Gegeben, Ihre Umsetzung mag dies ein wenig seltsam, aber die haben wohl gedacht, eine Art verkettete Liste-Implementierung von stack (was den Vorteil hat, dass Sie nicht mit einer vordefinierten Obergrenze), in dem Fall die Warteschlange geerbt von stack-klar macht Sinn für design.
Ich vermute, dass "mit die stack für storage-Zwecke" bedeutet, dass die Verwendung der stack statt im heap. Das heißt, nicht rufen malloc, und verwenden Sie keine globalen Variablen.
Edit: Oder vielleicht auch nicht. Je mehr ich überlege, desto mehr vermute ich, es ist eine schlecht formulierte oder schlecht durchdacht Zuordnung.
Wenn Sie wirklich wollen, implementieren Sie eine Warteschlange mit einem stack könnte man hinzufügen, eine
Stack
member-variableQueue
Klasse. Die Methoden werden dann implementiert, wie dieses:Ist es eine sehr ineffiziente Umsetzung.
Also wirklich, es ist eine Frage des Gebens ein Stapel input und dann herausnehmen von Informationen aus diesem Stapel, als ob es eine que.
Denke ich nicht, dass Sie brauchen, um pop ALLE ganzen zahlen aus dem stack. Sind Sie erlaubt, andere Methoden für den stack? Ich meine, basiert auf der x86 -, Sie können immer erhalten Elemente auf einem stack, basierend auf Ihrer Adresse.
In diesem Sinne, können Sie immer das erste element auf die que durch abrufen der "first-in' Daten-Mitglied, das immer am ersten index des Arrays innerhalb der stack-Datenstruktur (wie dargestellt in Ihrem Prototyp).
So, da der stack ist LIFO-und das que ist FIFO, verwenden Sie diese zu Ihrem Vorteil, da die que-Daten-Struktur ist abhängig von der stack-Datenstruktur. Wenn Sie können, schließen Sie eine Methode, die es erlaubt die Abfrage des ersten Elements auf "oben" auf dem stack (das wäre das element @ index 0).
Stellen Sie sicher, dass das ok ist mit Ihrem professor, wenn erste.
Gibt es verschiedene Typen von Warteschlangen:
Wenn Ihr queue ist eine LIFO-queue, als es wird lediglich eine Fassade aus einem Stapel, wo enque/deque Karte, um push/pop.
Wenn Sie möchten, eine FIFO-Warteschlange müssen Sie zwei Stapel und schieben Sie die Elemente von einem zum anderen, um zu bekommen, um das erste element, wenn es enqued, dann können Sie deque von oben auf dem zweiten Stapel (in umgekehrter Reihenfolge), soweit nichts anderes ist enqued. wenn das passiert, ned shift alles wieder auf den ersten Stapel... Nicht sehr effizient ist, aber vielleicht erkennen, dass ist der Sinn der übung...
NB: möchten Sie vielleicht, um zumindest die max Kapazität der stack konfigurierbar bei der Bauzeit. So dass es völlig dynamisch ist wahrscheinlich aus dem Rahmen der übung, die Sie versuchen zu lösen.
Einer queue ein stack von Ganzzahlen, die in Ihrer Instanz. Fügen Sie ganze zahlen auf dem stack und entfernen Sie Sie aus dem Stapel.