2016-11-05 3 views
1

Ich habe einige Probleme, die Code. Ich lese Datei in Code und baue einen Stapel und eine Warteschlangenstruktur. Aber der Code wurde nicht korrekt ausgeführt.Stapel und Warteschlangen mit doppelt verknüpften Liste in Java

Dies ist Node-Klasse I Doppel LinkedList

public class Node 
{ 
String data; 
Node next; 
Node prev; 

public Node(String data,Node next, Node prev){ 

    this.next=next; 
    this.data=data; 
    this.prev=prev; 

} 
public Node(){ 

} 

public String getData(){ 

    return data; 
} 

public void setData(String data){ 

    this.data=data; 
} 

public Node getNext(){ 

    return next; 
} 

public void setNext(Node next){ 
    this.next=next; 
} 

public Node getPrev(){ 

    return prev; 
} 

public void setPrev(Node prev){ 
    this.prev=prev; 
} 
    } 

** Dies ist Stack-Klasse verwendet. Dieses **

public class Stack { 

Node head = null; 
Node tail = null; 

int size=0; 

     public int getSize() { 
    return size; 
     } 

    public boolean isEmpty() 
     { 
    return head == null; 
    }  
    public void Push(String data) { 

    tail = head; 
    head = new Node(data,null,null); 
    head.data=data; 
    head.next= tail; 
    head.prev = null; 


    if(tail != null) { 
     tail.prev=head; 
    } 

    size++; 

    } 

    public void Pop() { 
    if (!isEmpty()) { 
     head = head.next; // delete first node 
     size--; 
    } else { 
     System.out.println("İs Empty"); 
    } 

} 

    public void Top() { 

    Node tmp = head; 
    while (tmp != null) { 
     System.out.println(tmp.getData()); 
     tmp = tmp.getNext(); 
    } 
} 
    } 

Dies ist Queues Klasse

public class Oueues { 

    Node head ; 
    Node tail; 



int size=0; 

public Oueues(){ 
    this.head=null; 
    this.tail=null; 
} 

public boolean isEmpty() 
{ 
    return head == tail; 
}  

    public int getSize() 
    { 
      return size; 
    }  

    public void insert(String data){ 

    Node tmp = new Node(data,null,null); 
    tmp.data=data; 
    tmp.next=null; 

    if(head==null){ 
     head=tail=tmp; 
     head.prev=null; 


    } 
    else{ 
     tail.next=tmp; 
     tmp.prev=tail; 
     tail=tmp; 





    } 
    } 

    public String remove(){ 

    if(head.next==tail) 
     return null;// list empty 
    Node tmp=head.next; 
    head.next=tmp.next; 
    tmp.next.prev=head; 
    list(); 
    return tmp.data; 



    } 

    public void list(){ 
     System.out.println("Queues"); 
     if(size==0){ 
      System.out.println("İs Empty"); 

     } 
    Node tmp=head; 
    while(tmp !=tail.getNext()){ 
     System.out.println(tmp.getVeri()+" "); 
     tmp= tmp.getNext(); 
    } 
     System.out.println(); 
    } 





    } 

ist Queues Klasse

import java.io.BufferedReader; 
    import java.io.File; 
    import java.io.FileReader; 
    import java.io.FileWriter; 
    import java.io.IOException; 
    import java.util.Scanner; 

    public class OGrenci { 

    public static void main(String[] args) throws IOException { 

    Scanner s = new Scanner(System.in); 
    Stack y = new Stack(); 
    Oueues k = new Oueues(); 
    FileWriter fwy; 
    FileWriter fwk; 

    File stack = new File("stack.txt"); 

    if (!stack.exists()) { 
     stack.createNewFile(); 
    } else { 
     System.out.println("already exists "); 
    } 

    BufferedReader reader = null; 
    reader = new BufferedReader(new FileReader(stack)); 
    String line = reader.readLine(); 

    while (line != null) { 

     y.Push(line = reader.readLine()); 
     System.out.println(line); 
    } 

    File queue = new File("queue.txt"); 

    if (!queue.exists()) { 
     queue.createNewFile(); 
    } else { 
     System.out.println("already exists "); 
    } 

    BufferedReader read = null; 
    read = new BufferedReader(new FileReader(queue)); 
    String lines = read.readLine(); 

    while (lines != null) { 

     lines = read.readLine(); 
     k.insert(lines); 
     System.out.println(lines); 
    } 

    int choice; 

     System.out.println("1. Stack out- queue add"); 
     System.out.println("2. Stack add- queue out"); 
     System.out.println("3. Stack and queue "); 
     System.out.println("4. File writer"); 
     choice = s.nextInt(); 

    switch (choice) { 
     case 1: 

      k.insert(s.next()); 
      k.list(); 
      y.pop(); 

      break; 
     case 2: 
      y.Push(s.next()); 
      y.Top(); 
      k.remove(); 


      break; 
     case 3: 

      y.Top(); 
      k.list(); 
      break; 
     case 4: 

      fwy = new FileWriter(stack); 
      Node no = y.head; 
      while (no.next != null) { 
       fwy.write("\n" + no.data); 
       no = no.next; 
      } 
      fwy.flush(); 
      fwy.close(); 

      fwk = new FileWriter(queue); 
      Node noo = k.head; 
      while (noo.next != null) { 
       fwk.write("\n" + noo.data); 
       noo = noo.next; 
      } 

      fwk.flush(); 
      fwk.close(); 
      break; 
     } 
     } 
+1

Was ist Ihr spezifisches Problem? Erhalten Sie Fehlermeldungen oder falsche Ausgaben? Welcher Teil des Codes funktioniert nicht wie erwartet? – DUman

+1

Problem ist, dass Stack-Klasse und Queue-Klasse Add-Methode und Remove-Methode, die nicht ganz wahr ist. Diese Methode fügt den ersten Index nicht hinzu. Auch Datei schreiben nicht alle Daten. – mrsengineer

Antwort

1

Ok, so dass Sie ein paar Probleme haben. Ich werde auf einige hinweisen und dich arbeiten lassen, um den Rest zu reparieren, weil das wie eine Aufgabe aussieht und ich deine Hausaufgaben nicht für dich machen will :).

Erstens, wenn Sie aus der Datei gelesen vorsichtig sein, nicht das erste Element zu ignorieren:

String line = reader.readLine(); 

    while (line != null) 
    { 
     System.out.println("Read from stack: " + line); 

     // we already read one element 
     y.Push(line); 
     line = reader.readLine(); 
    } 

Beachten Sie, dass im Gegensatz zu Ihrer Lösung, die ich zuerst tut die Push y.Push(line), damit wir nicht vergessen, hinzuzufügen, was auch immer Lesen Sie bereits in line. Das Gleiche gilt für die Queue-Datei:

String lines = read.readLine(); 

    while (lines != null) 
    { 
     System.out.println("Read from queue: " + lines); 
     // we already read one line 
     k.insert(lines); 
     lines = read.readLine(); 
    } 

es einfach hinzufügen, wenn es nicht null ist und dann die nächste Zeile lesen. Sie haben immer das erste Element aus der Datei vermisst.

Ein weiteres Problem ist die Queues-Klasse (die übrigens falsch geschrieben ist, sollten Sie O durch Q ersetzen). Dieser funktioniert nicht richtig, weil Sie vergessen haben, die Größe zu erhöhen oder zu verringern, wenn Sie einfügen oder entfernen.

public void insert(String data){ 

    Node tmp = new Node(data,null,null); 
    tmp.data=data; 
    tmp.next=null; 

    if(head==null){ 
     head=tail=tmp; 
     head.prev=null; 
    } 
    else{ 
     tail.next=tmp; 
     tmp.prev=tail; 
     tail=tmp; 
    } 
    size++; 
} 

Beachten Sie, dass ich am Ende des Einsatzes bin Erhöhung der size, so dass die list Methode werfen keine NullPointerException jedes Mal, wenn wir es nennen. Das Gleiche gilt für die remove Methode:

public String remove(){ 

    if(head == null) 
     return null;// list empty 
    Node tmp=head.next; 
    head.next=tmp.next; 
    tmp.next.prev=head; 
    size--; 
    list(); 
    return tmp.data; 
} 

Bitte beachten Sie auch feststellen, dass Ihre Check vor (if(head.next==tail)) auch NullPointerException weil am Anfang werfen wurden die head immer null so können Sie nicht das next Mitglied zugreifen. Schließlich habe ich auch eine kleine Verbesserung der list Verfahren hergestellt, so dass wir früher zurück:

public void list(){ 
    System.out.println("Queues"); 
    if(size==0){ 
     System.out.println("İs Empty"); 
     return; 
    } 

    Node tmp=head; 
    while(tmp != tail.getNext()){ 
     System.out.println(tmp.getData() + " "); 
     tmp= tmp.getNext(); 
    } 
    System.out.println(); 
} 

Beachten Sie die return wenn die Warteschlange leer ist, sonst werden wir versuchen, tail.getNext() zu tun, was immer ein NullPointerException werfen .

Einige wichtige Gedanken über den Code im Allgemeinen Bitte vermeiden Sie seltsame Benennung.Warum Warteschlangen? Es gibt nur einen, also sollte es Warteschlange sein. Bitte vermeiden Sie seltsame Variablennamen. Ihr Code ist nicht nur für Sie, Chancen sind jemand anderes muss möglicherweise lesen und es wird schwer zu wissen, wer es ist s, y, k, fwy and fwk. Warum Namensgebung sie nicht so:

Scanner scanner = new Scanner(System.in); 
Stack stack = new Stack(); 
Queues queue = new Queues(); 
FileWriter stackFileWriter; 
FileWriter queueFileWriter; 

Und das gleiche gilt für Methoden. Warum Push, Pop und Top sind die einzigen Methoden, die mit Großbuchstaben beginnen? Wenn Sie nicht der standardmäßigen Java-Namenskonvention zustimmen, die in Ordnung ist, aber zumindest konsistent sein sollte :).

Probieren Sie die vorgeschlagenen Verbesserungen aus und sehen Sie, wie Ihr Programm funktioniert. Ich bin mir fast sicher gibt es mehr Probleme damit. Wenn du sie nicht selbst herausfinden kannst hinterlasse einen Kommentar und ich werde dir helfen. Viel Glück!

+1

Vielen Dank für Ihre Hilfe. Ich bin Student und ich brauche Hilfe die meiste Zeit, weil ich \t am Lernprozess bin. Du bist sehr nett. Ich bin sehr verpflichtet. Ich korrigiere meinen Fehler und kann vorsichtig mit der Syntax umgehen. – mrsengineer

+1

Ok, es ist auch eine gute Idee zu lernen, wie man den Code in Einheiten testet. Vermeiden Sie es, viel Code zu schreiben, ohne zu testen, ob es funktioniert. Verwenden Sie die so genannte Methode "Code ein wenig, testen Sie ein wenig", in der Sie unmittelbar nach dem Hinzufügen einer Methode beispielsweise einen Komponententest schreiben, um sicherzustellen, dass er wie gewünscht funktioniert. Bitte markieren Sie die Antwort als akzeptiert, wenn Sie mit der Antwort zufrieden sind. – AlinG

Verwandte Themen