hey guys i have a problem when trying to print out the circular queue array heres my code:
public class CircularQueue {
private int [] queue;
private int front, rear;
// do not change the constructor
CircularQueue() {
queue = new int [5];
front = 0;
rear = -1;
}
// FILL IN:
// throws DSException if out of space
public void enqueue ( int item ) throws DSException {
if ( front == 0 && rear == -1 ){
throw new DSException();
}
queue[rear+1] = item;
rear = (rear+1)%queue.length;
}
// FILL IN:
// throws DSException if no element in the queue
// return the dequeued value
public int dequeue () throws DSException {
if ( front == 0 && rear == -1 ){
throw new DSException();
}
int temp = queue[front];
queue[front] = 0;
front = (front+1)%queue.length;
return temp;
}
// FILL IN:
// return the value at beginning of the queue
// throws DSException if no element in the queue
public int first () throws DSException {
return front;
}
// FILL IN:
// print the circular queue in the following format
// - print "+" before the value at the front
// - print "-" after the value at the rear
// - print "." for the places without valid element.
public void print () {
System.out.print(" <");
for ( int i = 0; i < queue.length; i++ ){
if ( front == 0 && rear == -1 ){
System.out.print("."+"\t");
} else if ( i == front ) {
System.out.print("+"+ queue[i]);
} else if ( i == rear ) {
System.out.print( queue[i]+ "-");
} else if ( i == front && i == rear) {
System.out.print("+"+ queue[i] +"-");
} else {
System.out.print( queue[i] );
}
}
System.out.print(">\n");
}
}
and here's the result EMPTY: <. . . . . > ENQUEUE (0):
i am supposed to enqueue 0-4 and dequeue some element but it stops after enqueue 0.
A CircularQueue can be in 3 states whose invariants are given below :
Empty : front == -1 && rear == -1
Full : (rear+1)%queue.length == front
Neither empty nor full : Does not satisfy the conditions mentioned above
public class CircularQueue {
private int [] queue; private int front, rear; // do not change the constructor CircularQueue() { queue = new int [5]; front = -1; rear = -1; } // FILL IN: // throws DSException if out of space public void enqueue ( int item ) throws DSException,Exception { if ( front == -1 && rear == -1 ){ front = 0; rear = 0; queue[rear] = item; } else if((rear+1)%queue.length == front) { throw new Exception("Full"); } else { rear = (rear+1)%queue.length; queue[rear] = item; } } // FILL IN: // throws DSException if no element in the queue // return the dequeued value public int dequeue () throws DSException { if ( front == -1 && rear == -1 ){ throw new DSException(); } else { int ret = queue[front]; if(rear==front) { rear = -1; front = -1; } else { front = (front+1)%queue.length; } return ret; } } // FILL IN: // return the value at beginning of the queue // throws DSException if no element in the queue public int first () throws DSException { if(front==-1 && rear ==-1) { throw new DSException(); } return queue[front]; } // FILL IN: // print the circular queue in the following format // - print "+" before the value at the front // - print "-" after the value at the rear // - print "." for the places without valid element. public void print () { if(front==-1 && rear == -1) { for(int i=0;i<queue.length;i++) { System.out.print("."); } } else { if(front<=rear) { for(int i=0;i<=front-1;i++) { System.out.print("."); } System.out.print("+"); for(int i=front;i<=rear;i++) { System.out.print(queue[i]); } System.out.print("-"); for(int i=rear+1;i<=queue.length-1;i++) { System.out.print("."); } } else { for(int i=0;i<=rear;i++) { System.out.print(queue[i]); } System.out.print("-"); for(int i=rear+1;i<=front-1;i++) { System.out.print("."); } System.out.print("+"); for(int i=front;i<=queue.length-1;i++) { System.out.print(queue[i]); } } } }
}
private int [] queue; private int front, rear; // do not change the constructor CircularQueue() { queue = new int [5]; front = -1; rear = -1; } // FILL IN: // throws DSException if out of space public void enqueue ( int item ) throws DSException,Exception { if ( front == -1 && rear == -1 ){ front = 0; rear = 0; queue[rear] = item; } else if((rear+1)%queue.length == front) { throw new Exception("Full"); } else { rear = (rear+1)%queue.length; queue[rear] = item; } } // FILL IN: // throws DSException if no element in the queue // return the dequeued value public int dequeue () throws DSException { if ( front == -1 && rear == -1 ){ throw new DSException(); } else { int ret = queue[front]; if(rear==front) { rear = -1; front = -1; } else { front = (front+1)%queue.length; } return ret; } } // FILL IN: // return the value at beginning of the queue // throws DSException if no element in the queue public int first () throws DSException { if(front==-1 && rear ==-1) { throw new DSException(); } return queue[front]; } // FILL IN: // print the circular queue in the following format // - print "+" before the value at the front // - print "-" after the value at the rear // - print "." for the places without valid element. public void print () { if(front==-1 && rear == -1) { for(int i=0;i<queue.length;i++) { System.out.print("."); } } else { if(front<=rear) { for(int i=0;i<=front-1;i++) { System.out.print("."); } System.out.print("+"); for(int i=front;i<=rear;i++) { System.out.print(queue[i]); } System.out.print("-"); for(int i=rear+1;i<=queue.length-1;i++) { System.out.print("."); } } else { for(int i=0;i<=rear;i++) { System.out.print(queue[i]); } System.out.print("-"); for(int i=rear+1;i<=front-1;i++) { System.out.print("."); } System.out.print("+"); for(int i=front;i<=queue.length-1;i++) { System.out.print(queue[i]); } } } }
}
This is my approach. But I am assuming here that the empty blocks in the array are initialized with zero, and that any valid entry would be non-zero. Also, it will print zeros in case the queue is partially filled.
public void print() {
if (isEmpty()) {
System.out.println("Queue is empty");
} else {
System.out.println("In order from latest to oldest");
int i = front;
while (i < array.length) {
System.out.print(array[i] + " ");
i++;
}
i = i % array.length;
if(array[i] != 0) {
while(i < front) {
System.out.print(array[i] + " ");
i++;
}
}
}
}
Problem with circular arrays and front/rear indices is that 'full' and 'empty' are indistinguishable. You will have to add a boolean 'empty', which is initially true, and is used in the tests.
private int [] queue;
private int front, rear;
private boolean empty;
// do not change the constructor
CircularQueue() {
queue = new int [5];
front = 0;
rear = -1;
empty = true;
}
// FILL IN:
// throws DSException if out of space
public void enqueue ( int item ) throws DSException {
if (!empty && (front - rear + queue.length) % queue.length == 1){
throw new DSException();
}
queue[rear+1] = item;
rear = (rear+1)%queue.length;
empty = false;
}
// FILL IN:
// throws DSException if no element in the queue
// return the dequeued value
public int dequeue () throws DSException {
if (empty){
throw new DSException();
}
int temp = queue[front];
queue[front] = 0;
front = (front+1)%queue.length;
empty = (front - rear + queue.length) % queue.length == 1;
return temp;
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.