2016-11-09 1 views
2

J'essaie de créer un programme qui imprime l'entrée de l'utilisateur dans un premier entré, premier sorti. J'ai actuellement fait un programme qui imprime la pile LIFO (dernier entré, premier sorti). Cependant, comment pourrais-je mettre en œuvre une file d'attente qui afficherait la sortie de la pile dans un ordre FIFO (premier entré, premier sorti).J'essaye d'implémenter une file d'attente qui renverserait la pile faite et la pile FIFO d'impression?

Mon code ci-dessous:

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

s'il vous plaît noter que votre code ne compile pas, en effet, vous utilisez les constructeurs non existants de la classe 'Node' –

+0

Pourquoi inverser, au lieu d'ajouter les éléments à une structure de file d'attente plutôt que d'une pile. Vous pouvez également implémenter un Deque (file d'attente double) https://en.wikipedia.org/wiki/Double-ended_queue et obtenir le comportement Stack and Queue. Voir aussi l'interface 'Deque' https://docs.oracle.com/javase/7/docs/api/java/util/Deque.html –

Répondre

1

I modifié comme indiqué ci-dessus. Inverser la logique. La méthode originale du scanner n'a pas été correctement formatée.

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

Merci, je vois exactement ce que je faisais mal maintenant. –