Skip to content
Advertisement

I need help Returning a string representation of my circular queue

I am trying to returns a string representation of my circular queue heres what I have so far. (Im not allowed to use/import other libraries in my code)

public class A2KeyesOwenQueue {
    private int front;
    private int rear;
    private int numItems;
    private int[] myArray;

    public A2KeyesOwenQueue() {
        // the default size of the queue is 10
        myArray = new int[10];
        numItems = 0;
        front = 0;
        rear = 0;
    }

    // Adds one element to the rear of the queue. Returns true if successful, false
    // otherwise
    public boolean enqueue(int elements) {
        if (numItems < 10) {
            myArray[rear] = elements;
            rear = (rear + 1) % myArray.length;
            numItems++;
            return true;
        }
        else
            return false;
    }

    // Removes and returns the element at the front of the queue
    public int dequeue() {
        int temp;
        if (numItems == 0) {
            return -9999;
        }
        else
            temp = myArray[front];
        front = (front + 1) % myArray.length;
        numItems--;
        return temp;
    }

    // Returns without removing the element at the front of the queue
    public int peek() {
        if (numItems == 0) {
            return -9999;
        }
        else
            return myArray[front];

    }

    // Returns true if the queue contains no elements
    public boolean isEmpty() {
        if (numItems == 0) {
            return true;
        }
        else
            return false;
    }

    // Returns the number of elements in the queue
    public int size() {
        return numItems;
    }

    // Returns a string representation of the queue
    public String toString() {
        String arr;
        arr = "[";
        if (numItems > 0) {
            for (int i = 0; i < 10 && i < numItems; i++) {
                arr = arr + myArray[i] + ", ";
            }
            arr = arr + myArray[0] + "]";
        }
        else {
            arr = arr + "]";
        }
        return arr;
    }
}

My public String toString( ) doesn’t return the right numbers on my test driver. I think it has something to do with it not circling the array.

public String toString( ){
String arr;
arr = "[";
if (numItems > 0){
  for (int i = 0; i < 10 && i < numItems ;i++) {
   
    arr = arr + myArray[i]+", ";
  }

  arr = arr + myArray[0] + "]";
}
else{
  arr = arr + "]";
 }return arr;
}

And my driver:

/*
 * This class performs test cases for queue
 * 
 * */
class DriverTest2{

    public static void main(String[] args) { 
        int myMark = 0;
        // TEST 1 
        // (1 mark) A queue is empty on construction
        A2KeyesOwenQueue  q = new A2KeyesOwenQueue();
        if (q.isEmpty()) {
            System.out.println("nTest 1 successfull: +1");
            myMark=myMark + 1;
        }
        else {
            System.out.println("nTest 1 failed********************");
        }
        // TEST 2
        // (1 mark) A queue has size 0 on construction
        if (q.size()==0) {
            System.out.println("nTest 2 successfull: +1");
            myMark=myMark + 1;
        }
        else {
            System.out.println("nTest 2 failed********************");
        }
        // TEST 3
        // (3 mark)After n enqueues to an empty queue, n > 0,
        // the queue is not empty and its size is n
        q = new A2KeyesOwenQueue (); // reset queue
        for (int i = 100; i < 150; i+=10) {
            System.out.print ("enqueuing " + i);
            if (q.enqueue(i)) {
                System.out.print("... success");
            }
            else {
                System.out.print("... failed");
            }
            System.out.println ();
        }
        if (!q.isEmpty() && q.size()==5) {
            System.out.println("nTest 3 successfull: +3");
            myMark=myMark + 3;
        }
        else {
            System.out.println("nTest 3 failed********************");
        }
        // TEST 4
        // (2 mark) If one enqueues x then peeks, the value returned is x, but the size stays the same
        q = new A2KeyesOwenQueue (); // reset queue
        // insert 5 elements 1000 900 800 700 600
        for (int i = 1000; i > 500; i-=100) {
            System.out.print ("Trying to enqueue :" + i);
            if (q.enqueue(i)) {
                System.out.print("... success");
            }
            else {
                System.out.print("... failed");
            }
            System.out.println();
        }
        q.enqueue(100);
        int myPeek = q.peek();
        if (q.size()==6) {
            System.out.println("nTest 4 part 1 successfull: +1");
            myMark=myMark + 1;
        }
        else {
            System.out.println("nTest 4 part 1 failed********************");
        }
        if (myPeek == 1000) {
            System.out.println("nTest 4 part 2 successfull: +1");
            myMark = myMark + 1;
        }
        else {
            System.out.println("nTest 4 part 2 failed********************");
        }

        // TEST 5
        // If one enqueues x then dequeues, the value dequeued
        // is x.
        q = new A2KeyesOwenQueue(); // reset queue
        q.enqueue(3);
        int temp = q.dequeue();
        if (temp == 3) {
            System.out.println("nTest 5 successfull: +1");
            myMark = myMark + 1;
        }
        else {
            System.out.println("nTest 5 failed********************");
        }
        // TEST 6
        // (2 mark) If the size is n, then after
        // n dequeues, the stack is empty and has a size 0
        // reset the queue
        q = new A2KeyesOwenQueue();
        // insert 5 elements 1000 900 800 700 600
        for (int i = 1000; i > 500; i -= 100) {

            System.out.print("Trying to enqueue :" + i);
            if (q.enqueue(i)) {
                System.out.print("... success");
            }
            else {
                System.out.print("... failed");
            }
            System.out.println();
        }
        for (int i = 0; i < 5; i++) {
            q.dequeue();
        }
        if (q.size() == 0) {
            System.out.println("nTest 6 successfull: +2");
            myMark = myMark + 2;
        }
        else {
            System.out.println("nTest 6 failed********************");
        }
        // TEST 7
        // (1 mark) call peek() with one item
        // reset the queue
        q = new A2KeyesOwenQueue();
        q.enqueue(50);
        int temp7 = q.peek();
        if (temp7 == 50) {
            System.out.println("nTest 7 successfull: +1");
            myMark = myMark + 1;
        }
        else {
            System.out.println("nTest 7 failed********************");
        }

        // TEST 8
        // (1 mark) call peek() from an empty queue
        // returns -9999 representing no such element
        q = new A2KeyesOwenQueue();
        int temp8 = q.peek();
        if (temp8 == -9999) {
            System.out.println("nTest 8 successfull: +1");
            myMark = myMark + 1;
        }
        else {
            System.out.println("nTest 8 failed********************");
        }
        // TEST 9
        // (1 mark) call dequeue() from an empty queue
        // returns -9999 representing no such element
        q = new A2KeyesOwenQueue();
        int temp9 = q.dequeue();
        if (temp9 == -9999) {
            System.out.println("nTest 9 successfull: +1");
            myMark = myMark + 1;
        }
        else {
            System.out.println("nTest 9 failed********************");
        }
        // TEST 10
        // (1 mark) call dequeue() on an queue with one item.
        q = new A2KeyesOwenQueue();
        q.enqueue(50);
        int temp10 = q.dequeue();
        if (temp10 == 50) {
            System.out.println("nTest 10 successfull: +1");
            myMark = myMark + 1;
        }
        else {
            System.out.println("nTest 10 failed********************");
        }
        q = new A2KeyesOwenQueue(); // reset queue
        // TEST 11 enqueue elements until full plus one more element
        boolean t11 = false;
        for (int i = 100; i < 200; i += 10) {

            System.out.print("nTrying to enqueue :" + i);
            if (q.enqueue(i)) {
                System.out.print("... success");
            }
        }
        if (!q.enqueue(210)) {
            System.out.println("... failed");
            System.out.println("nTest 11 successfull: +1");
            t11 = true;
            myMark = myMark + 1;
        }
        if (!t11) {
            System.out.println("nTest 11 failed********************.");
        }
        // TEST 12
        // (2 mark) If one enqueues the values 1 through 10, in order,
        // into an empty queue, then if 10 dequeues are done the values
        // dequeues are 1 through 10.

        // reset the queue
        System.out.println("nTest 12.");
        q = new A2KeyesOwenQueue();
        int i;
        // insert 10 elements 1 through 10
        for (i = 1; i <= 10; i++) {

            System.out.print("Trying to enqueue :" + i);
            if (q.enqueue(i)) {
                System.out.print("... success");
            }
            else {
                System.out.print("... failed");
            }
            System.out.println();
        }
        boolean t12 = true;
        for (i = 1; i < 10; i++) {
            if (i == q.dequeue()) {
                System.out.println("Dequeued expected element");
            }
            else {
                System.out.println("The element expected was not what was recieved");
                t12 = false;
            }
        }
        if (t12) {
            System.out.println("nTest 12 successfull: +2");
            myMark = myMark + 2;
        }
        else {
            System.out.println("nTest 12 failed********************");
        }

        // TEST 13
        // (1 mark) print all elements in queue when front < rear
        // reset the queue
        q = new A2KeyesOwenQueue();
        // insert 7 elements 50 51 52 53 54 55
        for (i = 50; i < 56; i += 1) {

            System.out.print("Trying to enqueue :" + i);
            if (q.enqueue(i)) {
                System.out.println("... success");
            }
            else {
                System.out.println("... failed");
            }

        }
        int stringOutput = 0;
        System.out.println("nTEST 13"); // (1 mark)
        String myQ, yourQ;
        System.out.println("The elements in queue according to Mr. Corea:");
        myQ = "[50, 51, 52, 53, 54, 55]";
        yourQ = q.displayQueue(); //toString();
        System.out.println(myQ);
        System.out.println("The elements in queue according to You:");
        System.out.println(yourQ);
        System.out.println("MATCH: " + myQ.equals(yourQ));
        if (myQ.equals(yourQ)) {
            System.out.println("nTest 13 successfull: +1");
            stringOutput += 1;
        }
        else {
            System.out.println("Test 13 failed********************");
        }
        // TEST 14 print all elements in queue when rear < front
        // reset the queue
        q = new A2KeyesOwenQueue();
        // insert 10 elements 50 51 52 53 54 55 56 57 58 59
        for (i = 50; i < 60; i += 1) {

            System.out.print("Trying to enqueue :" + i);
            if (q.enqueue(i)) {
                System.out.print("... success");
            }
            else {
                System.out.print("... failed");
            }
            System.out.println();
        }

        // dequeue 5 elements
        q.dequeue();
        q.dequeue();
        q.dequeue();
        q.dequeue();
        q.dequeue();

        // enqueueing 3 more
        q.enqueue(60);
        q.enqueue(61);
        q.enqueue(62);
        System.out.println("nTEST 14"); // (2 mark)
        System.out.println("The elements in queue according to Mr. Corea:");
        myQ = "[55, 56, 57, 58, 59, 60, 61, 62]";
        yourQ = q.displayQueue(); //toString();
        System.out.println(myQ);
        System.out.println("The elements in queue according to You:");
        System.out.println(yourQ);
        System.out.println("MATCH: " + myQ.equals(yourQ));
        if (myQ.equals(yourQ)) {
            System.out.println("nTest 14 successfull: +2");
            stringOutput += 2;
        }
        else {
            System.out.println("Test 14 failed********************");
        }

        // dequeue 2 elements
        System.out.println(q.dequeue());
        System.out.println(q.dequeue());
        System.out.println(q.dequeue());
        System.out.println(q.dequeue());
        System.out.println(q.dequeue());
        System.out.println(q.dequeue());
        System.out.println(q.dequeue());
        System.out.println(q.dequeue());
        System.out.println(q.dequeue());
        System.out.println(q.dequeue());
        System.out.println("nTEST 15"); // (2 mark) print an empty queue
        System.out.println("The elements in queue according to Mr. Corea:");
        myQ = "[]";
        yourQ = q.displayQueue(); //toString();
        System.out.println(myQ);
        System.out.println("The elements in queue according to You:");
        System.out.println(yourQ);
        System.out.println("MATCH: " + myQ.equals(yourQ));
        if (myQ.equals(yourQ)) {
            System.out.println("nTest 15 successfull: +2");
            stringOutput += 2;
        }
        else {
            System.out.println("Test 15 failed********************");
        }
        System.out.println("TEST RESULTS: " + myMark + " /17 plus " + stringOutput
                + "/5 for correct toString()");

    }
}

Help would be appreciated

Advertisement

Answer

Here is the body of method toString() that returns the correct result.
(Notes after the code.)

String arr = "[";
if (numItems > 0) {
    if (rear == front) {
        arr += myArray[front];
    }
    else {
        int limit;
        if (rear > front) {
            limit = rear;
        }
        else {
            limit = 10;
        }
        boolean first = true;
        for (int i = front; i < limit; i++) {
            if (first) {
                first = false;
            }
            else {
                arr += ", ";
            }
            arr += myArray[i];
        }
        if (rear < front) {
            for (int i = 0; i < rear; i++) {
                arr += ", ";
                arr += myArray[i];
            }
        }
    }
}
arr += "]";
return arr;

Since the queue is circular, the start of the queue starts at front and extends to rear.

If rear is equal to front, that means that the queue contains only a single element.

If rear is greater that front, that means the the queue is not full, i.e. less than ten elements have been added to the queue.

If rear is less than front, it means that myArray is full, i.e. contains ten elements, and so you need to print all the elements from front to the last element of myArray and then you need to print the first elements of myArray starting from the first element up to rear.

For example if myArray is as follows:

[60, 61, 62, 63, 54, 55, 56, 57, 58, 59]

and front equals 5 and rear equals 4, then rear is less than front so the first for loop in the above code will append the values from 55 to 59 and the second for loop will append the values from 60 to 63.

Note that I only changed method toString. I did not change any of the other code in your question. When I ran your test cases, this was the last line of the output.

TEST RESULTS: 17 /17 plus 5/5 for correct toString()
User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement