2017-04-24 164 views
-2

我有一個即將到來的考試,我正在努力解決這個問題,希望有人能幫助請。Java類實現先進先出隊列

提供一個實現該接口

interface StringQueue 
{ boolean isEmpty(); 
void add(String c); 
String front(); 
void removeFront(); 
} 

類應該提供一個標準的先入先出隊列的實現一個完整的Java類。隊列中的字符應存儲在使用QueueCell類型的對象構造的單鏈表中;你必須把這個班級寫成一個內部班級。 (您不能使用Collections Framework中的LinkedList類)。當應用於空隊列時,front和removeFront方法應該拋出QueueException類型的異常;您可能會認爲QueueException類已被寫入。

在此先感謝

+1

你的問題是什麼?這只是一個需求清單 –

+0

我認爲這不會幫助您看到實施。當然,它不會幫助你學習一個實現。即將舉行的考試將會要求你實施一個堆棧,這是非常不可能的。 –

+0

那麼你在這裏遇到什麼問題?通過Google搜索,您可以找到FIFO如何工作的例子。編寫2種方法,首先返回第一個元素並將其移除,以及將新元素放在列表末尾的第二種方法很難嗎? – FilipRistic

回答

0

我勸你看看我的實現,並嘗試自己編寫。否則,如果你只是複製並粘貼它,那對你來說就沒用了。

接口

public interface StringQueue { 
    boolean isEmpty(); 
    void add(String c); 
    String front(); 
    void removeFront(); 
} 

實現:

public class StringQueueImpl implements StringQueue { 
    private QueueCell head; 
    private int size = 0; 

    @Override 
    public boolean isEmpty() { 
     return false; 
    } 

    @Override 
    public void add(String c) { 
     if(head == null){ 
      head = new QueueCell(c); 
     } else { 
      QueueCell current = head; 
      while(current != null){ 
       if(current.next == null){ 
        current.next = new QueueCell(c); 
        break; 
       } else { 
        current = head.next; 
       } 
      } 
     } 
     size++; 
    } 

    @Override 
    public String front() throws QueueException { 
     if(size == 0 || head == null){ 
      throw new QueueException(); 
     } 
     return head.value; 
    } 

    @Override 
    public void removeFront() throws QueueException { 
     if(size == 0 || head == null){ 
      throw new QueueException(); 
     } 

     if(head.next != null){ 
      head = head.next; 
     } else { // if only 1 element is in the queue 
      head = null; 
     } 
     size--; 
    } 

    private static class QueueCell { 
     private QueueCell next; 
     private String value; 

     QueueCell(String s){ 
      value = s; 
     } 
    } 

    public static class QueueException extends RuntimeException { 
     public QueueException(){ 
      super("Queue is empty"); 
     } 
    } 
} 
+0

你會如何實現isEmpty? – Yahya

+0

@John只是一個'返回大小== 0'的'boolean'方法或'return head == null',任何一個都可以。 – Cargeh

1

它很容易嘗試

實現:

private LinkedList<E> list = new LinkedList<E>(); 
public void add(E item) { 
    list.addLast(item); 
} 
public E removeFront() { 
    return list.poll(); 
} 
public boolean isEmpty() { 
    return !list.isEmpty(); 
} 
public int size() { 
    return list.size(); 
} 
public void addItems(GenQueue<? extends E> q) { 
    while (q.hasItems()) list.addLast(q.dequeue()); 
} 
+1

「你不能使用Collections Framework中的LinkedList類」的哪一部分你不明白? – Cargeh