2016-03-23 9 views
0

Swapping i eine Funktion zu übernehmen, einen Stapel bilden möchten (als Array) und für den Stapel Vertauschen des ersten Elements mit dem letzten Element in dem Stapel so i zurückzukehren verwende einen Temp-Stack für die Daten und ich werde verwenden, aber wie weiß ich, wann ich das Ende des Stapels erreichen werde?das erste und das letzte Element in einem Stapel unter Verwendung von C++

Ich habe geschrieben, die Umsetzung des Stapels als Array , aber ich brauche Hilfe mit der Funktion Swap

void Swap(Stack x) 
{ 
Stack tmp(100); 
int top1 = x.pop; 

for (int i = 0;; i++) 
{ 
x.pop = tmp.push; 
} 

} 

i seine falsch wissen, aber ich bin nicht sicher, jede Hilfe würde geschätzt, dank bearbeiten i schrieb die Funktion auf den ersten dieser Art und fand ich nicht die Parameter nehmen

void stack::Swap() 
{ 
Stack tmp(100); 
int top1 = this->pop; 

for (int i = 0;; i++) 
{ 
this->pop = tmp.push 
} 

}; 

bearbeiten hier ist ein Code aus einer Antwort

Stack Swap(Stack x){ 

int mytop,mybottom; 

mytop=x.pop(); 

int tmp[x.length-2],i=0; 

while(!x.isEmpty()){ 

    mybottom=x.pop(); 

    tmp[i++]=mybottom; 


    } 

Stack returnIt; 

returnIt.push(mytop); 

for(i=0;i<=x.length -3;i++){ 

    returnIt.push(tmp[i]); 

    } 

returnIt.push(mybottom); 

return returnIt; 

} 

Antwort

0

IDEA: Shop Ober- und Unterseite des Stapels in einem variablen und Elemente zwischen oben und unten in einem Array. Jetzt schieben Sie einfach den unteren Teil des ursprünglichen Stapels in den neuen Stapel und dann die Elemente in der ursprünglichen Reihenfolge und schließlich den oberen Teil des ursprünglichen Stapels.

code.

#include <bits/stdc++.h> 
using namespace std; 
void rev(stack<int>&x){ 
    int sz=x.size(),mytop,mybottom; 
    mytop=x.top(); 
    x.pop(); 
    int tmp[sz-1],i=0; 
    while(!x.empty()){ 
     mybottom=x.top(); 
     tmp[i++]=mybottom; 
     x.pop(); 
     } 
    stack<int> returnIt; 
    returnIt.push(mybottom); 
    for(i=0;i<=sz-3;i++){ 
     returnIt.push(tmp[i]); 
     } 
    returnIt.push(mytop); 
    while(!returnIt.empty()){ 
     int tt=returnIt.top(); 
     x.push(tt); 
     returnIt.pop(); 
    } 
    } 
int main() { 
    // your code goes here 
    stack<int>x; 
    x.push(1); 
    x.push(2); 
    x.push(3); 
    x.push(4); 
    x.push(5); 
    stack<int>y=x; 
    cout<<"Before reversing : "; 
    while(!y.empty()){ 
     int tt=y.top(); 
     cout<<tt; 
     y.pop(); 
    } 

    rev(x); 
    cout<<"\nAfter reversing : "; 
    while(!x.empty()){ 
     cout<<x.top(); 
     x.pop(); 
    } 
    return 0; 
} 
+0

ich verstanden, was Sie getan haben, aber die Funktion eine Lücke so sollte die Funktion die folgenden tun, wenn der Stapel 1 betrug 2 3 4 5 sollte 5 2 werden 3 4 1 und so weiter für (Größe sein sollte) Es heißt Länge in dem Code, den ich schrieb, und es war ein privater Parameter, also änderte ich es in öffentliche und Länge ist eine Variable vom Benutzer –

+0

oops ich kehrte 'Stack' von einer Void-Funktion (das ist falsch) aber sowieso Sie können Stapel als Referenz übergeben und dann den Inhalt von 'returnIt' zum ursprünglichen Stapel kopieren, d. 'x' – Vimal

+0

ja ich tat das, aber das Problem ist, dass der ganze Stapel in umgekehrter Reihenfolge war –

0

Ich weiß nicht, ob ich wirklich Ihre Frage richtig verstanden, aber es sieht aus wie Sie das erste Element eines Stapels wollen, dass die erste die letzte und die letzte sein wird. Wenn ja, hast du nicht wirklich verstanden, wie ein Stack funktioniert und wann er verwendet wird, weil ein Stack im wirklichen Leben wie ein Stack ist. Zum Beispiel gehst du einen Stapel Pringles (ja die Kartoffelchips) in einen der klassischen Zylinder. Mit einem Stapel können Sie jetzt nur noch auf das oberste Element des Stapels zugreifen (das letzte hinzugefügte Objekt). Das heißt, der Stapel stürzt ab, wenn Sie versuchen, eines der Zentren zu entfernen. Aber wenn du ein Element in der Mitte haben willst, musst du so viele Elemente von oben nehmen, bis du dieses Element erreicht hast, aber wenn du so etwas machst, dann benutzt du einen Stapel falsch! Ein Stapel soll Objekte in der Reihenfolge sammeln, in der sie hinzugefügt wurden (wie eine Liste), aber nur mit Zugriff auf den Anfang. Sie können dies zum Beispiel für eine Rückgängig-Funktion in einem Editor verwenden, dort fügen Sie alle Aktionen, die Sie auf einem Stapel ausgeführt haben, hinzu. Wenn Sie nun die Undo-Funktion verwenden, kann eine nach der nächsten Aktion rückgängig gemacht werden, aber wenn Sie jetzt eine andere Aktion ausführen, gibt es ein neues Element oben auf dem Stapel und diese, die Sie genommen haben, können nicht wieder darauf platziert werden sind nur kaputt (Du kannst sie essen, wenn du willst) (wie ein Zeitparadoxon: "Du kannst etwas nicht rückgängig machen, was du nicht getan hast und du kannst nichts wiederholen, was du nie getan hättest").

Ich hoffe, ich habe Ihnen geholfen, den grundlegenden Job eines Stapels zu verstehen, aber wenn Sie eine andere Frage haben oder ich vermisse Ihre Frage verstehe, korrigieren Sie mich.

Aber wenn du wirklich willst, was du versuchst, musst du darüber nachdenken, wie du so etwas in Reallife machen kannst: Du musst jedes Element aus dem Stapel nehmen, eins nach dem anderen, und dann bauen ein neuer Stapel mit derselben Reihenfolge in der Mitte, aber der erste Index, den Sie auf den Stapel legen, ist der erste vom alten Stapel.

ich nie wirklich in C++ programmiert, aber in Pseudo-Code es könnte wie folgt aussehen:

Stack stack; 
List<StackElement> list; 
//Converting stack to list for better access 
for(int i = 0; i<stack.size;i++) 
{ 
    list.add(stack.top); 
    stack.pop; 
} 
//Add the last element from the list (the last from the stack) on top of the stack (thats now the only object in the stack) 
stack.push(list.get(list.size()-1)); 
list.remove(list.size()-1); //Remove this element 
//Save our last element 
StackElement lastElement = list.get(0); 
list.remove(0); 
//Inserting the mid 
for(int i = 0; i<list.size;i++) 
{ 
    stack.push(list.get(i)); 
} 
//Now put the last element from the old stack on top of the new 
stack.push(lastElement): 

Es tut mir leid für mein schlechtes Englisch, ich hoffe, dass Sie die grundlegende Sache verstanden was ich sagen wollte.Und der Code ist nur Theorie, es kann falsch sein!

+0

ich verstehe den Stapel und das ist, was ich für frage, wenn ich einen Stapel von 1 2 3 4 5 bis 5 2 3 4 1 mit einer Funktion geändert werden soll, sollte ich alle pop der Stapel, um zum letzten Element zu gelangen, und ich möchte, dass es eine Lücke ist, nicht den modifizierten Stapel zurückgeben –

+0

Was ist das Problem über die Rückkehr? Und Sie müssen es nicht tun, Sie könnten auch tun, was der Pseudo-Code direkt mit dem Stack sagt ... – Luftbaum

+0

dieses Problem ist als ein Stapel zu einem anderen Stapel die Hauptidee zu lösen Ich denke, 1 Geschäft die Spitze Element 2-Legen Sie die Mitte des ursprünglichen Stapels in einem anderen Stapel 3-Speichern Sie das letzte Element 4 geben Sie das erste Element auf den Stapel zurück 5- zurückgeben die Mitte dann das letzte Element nach oben aber ich brauche Hilfe beim Schreiben der Funktion –

Verwandte Themen