使用ArrayList实现循环队列

时间:2016-12-11 16:05:35

标签: java arrays arraylist

好的,所以用数组实现循环队列很容易。

这里我有一些代码尝试使用arraylist实现循环队列。问题是即使我已经实现了我的deque和enque方法,这对我的arraylist也不起作用(但这适用于普通数组)....

与数组不同,如果我在我的arraylist上使用此代码,它似乎是在不同的位置删除和添加错误

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 个答案:

答案 0 :(得分:2)

我对您的代码进行了一些更改,看看它是否对您有所帮助。

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());

    }

}