我需要创建一个循环数组队列,允许用户围绕"数组。我的老师已经检查了入队和出队的方法,但是我无法正确打印队列。
public class MyArrayQueue<E> implements QueueInterface<E> {
public static final int CAPACITY = 10;
private int capacity;
private E q[]; //array of E
private int f; //front
private int r; //rear
//constructor
public MyArrayQueue() {
this (CAPACITY);
}
//constructor
public MyArrayQueue(int n) {
capacity = n;
q = (E[]) new Object[capacity];
}
public void enqueue(E obj) throws FullQueueException {
if(size() == capacity - 1) { //cannot hold more than n-1
throw new FullQueueException("Full queue exception.");
}
q[r] = obj; //insert object in end of the queue
r = (r + 1) % capacity; //wrap around r
}
public E dequeue() throws EmptyQueueException {
if (isEmpty())
throw new EmptyQueueException("Empty queue exception.");
E temp = q[f]; //retrieve the front object
q[f] = null; //good programming practice
f = (f + 1) % capacity; //wrap around f
return temp;
}
public E front() throws EmptyQueueException {
if (isEmpty())
throw new EmptyQueueException("Empty queue exception.");
return q[f]; //return the front object without removing it
}
public boolean isEmpty() {
return (f == r);
}
public int size() {
return (capacity - f + r) % capacity;
}
//fix this loop for homework assignment, make it wrap around
public String toString() {
if (isEmpty())
return "[]";
String result = "[";
result += q[f];
for (int i = (f+1) % capacity; i != r; i = (i+1) % capacity) {
result += " " +q[i];
}
return result + "]";
}
} //end class
这也是我的客户端类。我将toString方法更改为用户Jyr建议的方法,但它仍然没有正确打印出来。在我的客户端类中实现它可能会有一些错误。
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
MyArrayQueue<String> list = new MyArrayQueue<>();
int capacity;
int CAPACITY = 10;
String q[];
for (int i = 0; i < CAPACITY; i++) {
capacity = i;
q = new String[i];
}
String name;
boolean flag = true;
int num;
while (flag) {
System.out.println();
System.out.println("1 ----- enqueue");
System.out.println("2 ----- dequeue");
System.out.println("3 ----- front");
System.out.println("4 ----- ouput elements in the queue");
System.out.println("5 ----- isEmpty");
System.out.println("6 ----- size");
System.out.println("0 ----- exit");
System.out.println();
System.out.println("Enter a command: ");
num = console.nextInt();
System.out.println();
switch(num) {
case 1:
try {
System.out.println("Enter a word to enqueue: ");
name = console.next();
list.enqueue(name);
}
catch (FullQueueException e) {
System.out.println("Full Queue");
}
break;
case 2:
try {
System.out.println(list.dequeue());
}
catch (EmptyQueueException e){
System.out.println("Empty Queue");
}
break;
case 3:
try {
System.out.println(list.front());
}
catch (EmptyQueueException e) {
System.out.println("Empty Queue");
}
break;
case 4:
System.out.println(list.toString());
break;
case 5:
System.out.println(list.isEmpty());
break;
case 6:
System.out.println(list.size());
break;
case 0:
flag = false;
System.out.println("Thank you for using this program. ");
break;
default:
System.out.println("Invalid input.");
break;
}
}
}
答案 0 :(得分:0)
我相信你的事情过于复杂。您想要的是从f
开始(例如i = f
),然后向上移动一步,但由于我们可以回绕,我们应该向上移动(i + 1) % capacity
。我们会一直这样做,直到我们到达终点(例如r
)。在我们进入此循环之前,我们应该验证队列是否为空(以防止错误)。如果它实际上是空的,我们只需返回一个只有两个括号的String
。所以你的代码看起来有点像这样;
public String toString() {
if (isEmpty()) return "[]";
String result = "[";
for (int i = f; i != r; i = (i+1)%capacity) {
result += q[i] + ", ";
}
return result.substring(0,result.length()-2) + "]";
// a bit dirty but gets the job done
}
或另一种方法(关于括号和逗号的印刷);
public String toString() {
if (isEmpty()) return "[]";
String result = "[";
result += q[f];
for (int i = (f+1)%capacity; i != r; i = (i+1)%capacity) {
result += ", " + q[i];
}
return result + "]";
}