2016-12-11 66 views
0

好,所以很容易实现一个带数组的循环队列。使用ArrayList实现循环队列

在这里我有代码试图使用arraylist实现循环队列。问题是,即使我已经实现了我的deque和enque方法,但这不适用于我的数组列表(但是,这与正常数组一起工作)...

与数组不同,如果我在我的数组列表中使用此代码,似乎被删除,并在不同的positionns

import java.util.*; 

public class People { 

    private final int DEFAULT_CAPACITY = 100; 
    private int front, rear, count; 
    private ArrayList<thePeople> people; 
    private int theMaxCapacity; 

    //----------------------------------------------------------------- 
    // Creates an empty queue using the specified capacity. 
    //----------------------------------------------------------------- 
    public People(int initialCapacity) { 
     front = rear = count = 0; 
     people = new ArrayList<thePeople>(Collections.nCopies(5, (thePeople) null)); 

    } 

    //----------------------------------------------------------------- 
    // Adds the specified element to the rear of the queue, expanding 
    // the capacity of the queue array if necessary. 
    //----------------------------------------------------------------- 
    public void enque(thePeople element) { 
     if (this.isFull()) { 
      System.out.println("Queue Full"); 

      System.exit(1); 
     } else { 
      people.set(rear, element); 
      rear = rear + 1; 
      if (rear == people.size()) { 
       rear = 0; 
      } 
      count++; 
     } 
    } 

    //----------------------------------------------------------------- 
    // Removes the element at the front of the queue and returns a 
    // reference to it. Throws an EmptyCollectionException if the 
    // queue is empty. 
    //----------------------------------------------------------------- 
    public thePeople dequeue() { 
     if (isEmpty()) { 
      System.out.println("Empty Queue"); 
     } 

     thePeople result = people.get(front); 
     people.set(front, null); 

     front = (front + 1) % people.size(); 

     count--; 

     return result; 
    } 

    //----------------------------------------------------------------- 
    // Returns true if this queue is empty and false otherwise. 
    //----------------------------------------------------------------- 
    public boolean isEmpty() { 
     return (count == 0); 
    } 

    //----------------------------------------------------------------- 
    // Returns the number of elements currently in this queue. 
    //----------------------------------------------------------------- 
    public int size() { 
     return count; 
    } 

    public boolean isFull() { 

     return count == people.size(); 
    } 

    public void mySimulation() { 
     Random rand1 = new Random(); 
     thePeople theM = null; 

     if (this.isFull()) { 
      this.people.remove(0); 
      System.out.println("Enqueueing..."); 
      this.enque(people.get(rand1.nextInt(people.size()))); 
      thePeople r1 = people.get(rear - 1); 
      System.out.println(people.toString()); 
      System.out.println(r1); 
      for (int e = 0; e < people.size(); e++) { 
       if (people.get(e) instanceof thePeople) { 
        System.out.println("G"); 
       } else { 
        System.out.println("D"); 
       } 
      } 

     } 

    } 

    //----------------------------------------------------------------- 
    // Returns a string representation of this queue. 
    //----------------------------------------------------------------- 
    @Override 
    public String toString() { 
     String result = ""; 
     int scan = 0; 

     while (scan < count) { 
      if (people.get(scan) != null) { 
       result += people.get(scan).toString() + "\n"; 
      } 
      scan++; 
     } 

     return result; 

    } 

    public static void main(String[] args) { 
     People Q1 = new People(25); 
     thePeople call1 = new thePeople("John King", "001 456 789"); 
     thePeople call2 = new thePeople("Michael Fish", "789 654 321"); 

     Q1.enque(call1); 
     Q1.enque(call2); 

     System.out.println(Q1.toString()); 
     ArrayList<thePeople> callerDetails = new ArrayList<>(Arrays.asList(call1, call2)); 
     Random rand = new Random(); 
     for (int z = 0; z <= 4; z++) { 
      Q1.enque(callerDetails.get(rand.nextInt(callerDetails.size()))); 

     } 
     System.out.println(Q1.toString()); 

    } 

} 

我的问题加错的是我怎么能修改enque和deque方法与araylist(圆形队列的ArrayList)工作?

+1

使用arraylist实现循环队列的基本思想被打破。如果这是一个学校作业,这是愚蠢的,我很抱歉你需要这样做。如果这是一个真正的应用程序,请使用'ArrayDeque'。 – Gene

回答

1

我对你的代码做了一些修改,看它是否对你有帮助。

import java.util.*; 

public class People { 

    private final int DEFAULT_CAPACITY = 100; 
    private int front, rear, count; 
    private ArrayList<thePeople> people; 
    private int theMaxCapacity; 

    //----------------------------------------------------------------- 
    // Creates an empty queue using the specified capacity. 
    //----------------------------------------------------------------- 
    public People(int initialCapacity) { 
     front = rear = count = 0; 
     people = new ArrayList<thePeople>(); 

    } 

    //----------------------------------------------------------------- 
    // Adds the specified element to the rear of the queue, expanding 
    // the capacity of the queue array if necessary. 
    //----------------------------------------------------------------- 
    public void enque(thePeople element) { 
     if (this.isFull()) { 
      System.out.println("Queue Full"); 
      System.exit(1); 
     } else { 
      people.add(element);   
     } 
    } 

    //----------------------------------------------------------------- 
    // Removes the element at the front of the queue and returns a 
    // reference to it. Throws an EmptyCollectionException if the 
    // queue is empty. 
    //----------------------------------------------------------------- 
    public thePeople dequeue() { 
     if (isEmpty()) { 
      System.out.println("Empty Queue"); 
     } 

     thePeople result = people.get(0); 
     people.remove(0);      

     return result; 
    } 

    //----------------------------------------------------------------- 
    // Returns true if this queue is empty and false otherwise. 
    //----------------------------------------------------------------- 
    public boolean isEmpty() { 
     return (people.size() == 0); 
    } 

    //----------------------------------------------------------------- 
    // Returns the number of elements currently in this queue. 
    //----------------------------------------------------------------- 
    public int size() { 
     return people.size(); 
    } 

    public boolean isFull() { 

     return people.size() == DEFAULT_CAPACITY; 
    } 

    public void mySimulation() { 
     Random rand1 = new Random(); 
     thePeople theM = null; 

     if (this.isFull()) { 
      this.people.remove(0); 
      System.out.println("Enqueueing..."); 
      this.enque(people.get(rand1.nextInt(people.size()))); 
      thePeople r1 = people.get(rear - 1); 
      System.out.println(people.toString()); 
      System.out.println(r1); 
      for (int e = 0; e < people.size(); e++) { 
       if (people.get(e) instanceof thePeople) { 
        System.out.println("G"); 
       } else { 
        System.out.println("D"); 
       } 
      } 

     } 

    } 

    //----------------------------------------------------------------- 
    // Returns a string representation of this queue. 
    //----------------------------------------------------------------- 
    @Override 
    public String toString() { 
     String result = ""; 
     int scan = 0; 

     while (scan < count) { 
      if (people.get(scan) != null) { 
       result += people.get(scan).toString() + "\n"; 
      } 
      scan++; 
     } 

     return result; 

    } 

    public static void main(String[] args) { 
     People Q1 = new People(25); 
     thePeople call1 = new thePeople("John King", "001 456 789"); 
     thePeople call2 = new thePeople("Michael Fish", "789 654 321"); 

     Q1.enque(call1); 
     Q1.enque(call2); 

     System.out.println(Q1.toString()); 
     ArrayList<thePeople> callerDetails = new ArrayList<>(Arrays.asList(call1, call2)); 
     Random rand = new Random(); 
     for (int z = 0; z <= 4; z++) { 
      Q1.enque(callerDetails.get(rand.nextInt(callerDetails.size()))); 

     } 
     System.out.println(Q1.toString()); 

    } 

} 
+1

我认为这应该工作,这是可能的,因为我想为这部分people.add(元素);并且对于deque不使用助手方法来实现代码的部分...? – blueGOLD

+1

我编辑了答案,忘记删除元素时出列。 – Shay

+1

这个答案是可以的,但只有它并没有考虑到环绕,因为“使用arrayList实现一个循环队列”,如添加rear =(rear + 1)%queue.length;和front =(front + 1)%queue.length; .....? – blueGOLD