2016-11-09 4 views
2

Я пытаюсь создать программу, которая будет печатать пользовательский ввод в первом порядке. В настоящее время я создал программу, которая выводит стек LIFO (последний раз в первый раз). Однако как я могу начать реализацию очереди, которая будет отображать вывод стека в порядке FIFO (первый в первом порядке).Я пытаюсь реализовать очередь, которая бы отменила стек и стек FIFO печати?

Мой код ниже:

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

Пожалуйста, обратите внимание, что ваш код не компилируется, на самом деле использовать несуществующие конструктор класса 'Node' –

+0

Почему обратные, вместо того, чтобы добавить элементы в очереди структуру, а не стек. В качестве альтернативы вы могли бы реализовать Deque (двухсторонняя очередь) https://en.wikipedia.org/wiki/Doubleendend_queue и получить как стеки, так и поведение в очереди. См. Также интерфейс 'Deque' https://docs.oracle.com/javase/7/docs/api/java/util/Deque.html –

ответ

1

я изменил, как указано выше. Реверсирование логики. Первоначальный метод сканирования был неправильно отформатирован.

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

Спасибо, я точно вижу, что я делал сейчас неправильно. –

Смежные вопросы