2016-11-09 8 views
2

Ich versuche, ein Programm zu machen, das die Benutzereingabe in einer First-In-First-Out-Reihenfolge drucken würde. Ich habe gerade ein Programm gemacht, das den Stapel LIFO (last in first out) druckt. Wie würde ich jedoch eine Warteschlange implementieren, die die Ausgabe des Stapels in einer FIFO-Reihenfolge (first in first out) anzeigt.Ich versuche, eine Warteschlange zu implementieren, die den Stack und FIFO-Stapel-Stapel umkehren würde?

Mein Code unten:

import java.util.*; 

public class stackReversal { 

    private class Node { 
     private String item; 
     private Node next; 
    } 

    private Node first = null; 

    public boolean isEmpty() { 
     return (first == null); 
    } 

    public void push(String s) { 
     Node node = new Node(); 
     node.item = s; 
     node.next = first; 

     first = node; 
    } 

    public String pop() { 
     if (first == null) 
      throw new RuntimeException("Stack Empty!"); 
     String result = first.item; 
     first = first.next; 
     return result; 

    } 

    public String popString() { 
     String result = ""; 
     Node current = first; 

     while (current != null) { 
      result += current.item; 
      current = current.next; 
     } 
     return result; 
    } 

    public String toString() { 

     StringBuilder nodes = new StringBuilder(); 

     Node node = first; 

     while (node != null) { 
      nodes.append(node.item).append("\n"); 
      node = node.next; 
     } 

     if(isEmpty()) { 
      return ""; 
     } else { 
      return nodes.toString().substring(0, nodes.toString().length()); 
     } 
    } 
    class Queue{ 
     Node first, last; 

     public void enqueue(Node n){ 
      if(first == null){ 
       first = n; 
       last = first; 
      }else{ 
       last.next = n; 
       last = n; 
      } 
     } 

     public Node dequeue(){ 
      if(first == null){ 
       return null; 
      }else{ 
       Node temp = new Node(first); 
       first = first.next; 
       return temp; 
      } 
     } 
    } 


    public static void main(String[] args) 
    { 
     stackReversal s = new stackReversal(); 
     Scanner input = new Scanner(System.in); 
     System.out.print("Enter strings:"); 
     String in = ""; 
     while (!in.equals("end-of-input")) 
     { 
      in = input.nextLine(); 
      if (in.equals("end-of-input")) 
       break; 
      else 
       s.push(in); 
     } 

     System.out.println("Strings:"+"\n" + s); 
    } 
} 
+0

Bitte beachten Sie, dass der Code nicht kompiliert, in der Tat Sie nicht vorhandene Konstruktoren der Klasse verwenden 'Node' –

+0

Warum umkehren, statt die Elemente in einer Warteschlange Struktur eher als ein Stapel hinzufügen. Alternativ könnten Sie eine Deque (Double-ended queue) https://en.wikipedia.org/wiki/Double-ended_queue implementieren und sowohl Stack- als auch Queue-Verhalten erhalten. Siehe auch die Schnittstelle 'Deque' https://docs.oracle.com/javase/7/docs/api/java/util/Deque.html –

Antwort

1

I wie oben vorgesehen geändert. Umkehrung der Logik. Die ursprüngliche Scanner-Methode wurde nicht korrekt formatiert.

import java.util.*; 

public class stackReversal { 

    private class Node { 
     private String item; 
     private Node next; 
     // private Node prev; 
    } 

    private Node first = null; 

    public boolean isEmpty() { 
     return (first == null); 
    } 

    public void push(String s) { 
     Node node = new Node(); 
     node.item = s; 
     node.next = first; 

     first = node; 
    } 

    public String pop() { 
     if (first == null) 
      throw new RuntimeException("Stack Empty!"); 
     String result = first.item; 
     first = first.next; 
     return result; 

    } 

    public String popString() { 
     String result = ""; 
     Node current = first; 

     while (current != null) { 
      result += current.item; 
      current = current.next; 
     } 
     return result; 
    } 

    public String toString() { 

     StringBuilder nodes = new StringBuilder(); 

     Node node = first; 



     while (node != null) { 
      nodes.append(node.item).append("\n"); 
      node = node.next; 
     } 

     if(isEmpty()) { 
      return ""; 
     } else { 
      return nodes.toString().substring(0, nodes.toString().length()); 
     } 
    } 
    class Queue{ 
     Node first, last; 

     public void enqueue(String s){ 
      Node node = new Node(); 
      node.item = s; 
      node.next = first; 

      first = node; 
     } 

     public Node dequeue(){ 
      if(first == null){ 
       return null; 
      }else{ 
       Node temp = new Node();//Node temp = new Node(); 
       first = first.next; 
       return temp; 
      } 
     } 
     public String toString() { 

      StringBuilder nodes = new StringBuilder(); 

      Node node = first; 

      while (node != null) { 
       // Insert the current item at the beginning of the String 
       nodes.insert(0, String.format("%s%n", node.item)); 
       node = node.next; 
      } 



      if(isEmpty()) { 
       return ""; 
      } else { 
       return nodes.toString().substring(0, nodes.toString().length()); 
      } 
     } 

    } 


    public static void main(String[] args) 
    { 
     stackReversal s = new stackReversal(); 
     Queue q = s.new Queue(); 
     Scanner input = new Scanner(System.in); 
     System.out.print("Enter strings:"); 
     String in = input.nextLine(); 
     while (!in.equals("end-of-input")) 
     { 

      if (in.equals("end-of-input")) 
       break; 
      else 
       q.enqueue(in); 
       s.push(in); 
      in = input.nextLine(); 
     } 


     System.out.println("Strings:"+"\n" + s); 
     System.out.println("Strings:"+"\n" + q); 
    } 
} 
+0

Danke ich sehe genau was ich jetzt falsch mache. –

Verwandte Themen