繁体   English   中英

循环队列数组实现

[英]Circular queue array implementation

我正在尝试创建一个等待列表,当主数组已满时,它将在 static 数组中保存客户姓名。当主数组获得空槽时,等待列表数组中的第一个客户将填满主数组的空槽并且添加的元素将被删除我正在尝试使用循环队列实现来创建它。遵循 FIFO(先进先出)系统

这是我想出的循环队列实现

public class CQueue {

int SIZE = 4; 
int front, rear;
int items[] = new int[4];

void initialize (String[]task) {
    for (int i = 0; i < task.length; i++) {
        task[i] = "FULL";
    }
}

CQueue() {
    front = -1;
    rear = -1;
}

boolean isFull() {
    if (front == 0 && rear == SIZE - 1) {
        return true;
    }
    if (front == rear + 1) {
        return true;
    }
    return false;
}

boolean isEmpty() {
    if (front == -1)
        return true;
    else
        return false;
}

void enQueue(int element) {
    if (isFull()) {
        System.out.println("Queue is full");
    } else {
        if (front == -1)
            front = 0;
        rear = (rear + 1) % SIZE;
        items[rear] = element;
        System.out.println("Inserted " + element);
    }
}


int deQueue() {
    int element;
    if (isEmpty()) {
        System.out.println("Queue is empty");
        return (-1);
    } else {
        element = items[front];
        if (front == rear) {
            front = -1;
            rear = -1;
        } 
        else {
            front = (front + 1) % SIZE;
        }
        return (element);
    }
}

void display() {
    int i;
    if (isEmpty()) {
        System.out.println("Empty Queue");
    } else {
        System.out.println("Front -> " + front);
        System.out.println("Items -> ");
        for (i = front; i != rear; i = (i + 1) % SIZE)
            System.out.print(items[i] + " ");
        System.out.println(items[i]);
        System.out.println("Rear -> " + rear);
    }
}

这个 delete 方法将接受用户输入以从任务数组中删除元素并添加队列中的先到元素。

void deleteArr(String task[]) {
    CQueue q = new CQueue();
    int NUM;
    Scanner sc = new Scanner(System.in);
    System.out.print("Enter customer num to delete : ");
    NUM = sc.nextInt()-1;
    task[NUM] = "EMPTY";
    int element = items[front];
    task[NUM]=Integer.toString(element);
    q.deQueue();
    q.display();
}

主要方法

    public static void main(String[] args) {
        int k =1;
        String task[] = new String[12];
        CQueue q = new CQueue();
        q.initialize(task);
        q.display();
        for (int i = 0; i < task.length; i++) {
            if (task[i].equals("FULL")) {
                q.enQueue(k);
                k++;
            }
        }
        while (true) {
            q.deleteArr(task);
            for (int j = 0; j < task.length; j++) {
                System.out.println(task[j]);
            }
        }

}

我坚持在删除任务数组时如何将队列元素添加到任务数组

我建议您检查 deteleArr function 中是否 front>=0。您还应该使用 main 中定义的队列实例,而不是新实例:

void deleteArr(String task[]) {
    int NUM;
    Scanner sc = new Scanner(System.in);
    System.out.print("Enter customer num to delete : ");
    NUM = sc.nextInt()-1;
    task[NUM] = "EMPTY";
    if(front>=0) {
        task[NUM]=Integer.toString(items[front]);
    }
    this.deQueue();
}

如果需要,可以使用以下显示队列 function:

void display() {
    int i;
    System.out.println("Print queue");
    System.out.println("===========");
    if (isEmpty()) {
        System.out.println("Empty Queue");
    } else {
        System.out.println("Front -> " + front);
        for (i = front; i <= rear; i++) {
            System.out.println("item["+i+"]: " +items[i]);
        }
        System.out.println("Rear -> " + rear);
    }
    System.out.println("============");
}

您可以使用另一个 function 来显示任务数组:

public static void printTaskArray(String task[]) {
    System.out.println("Print task[]");
    System.out.println("============");
    if (task.length==0) {
        System.out.println("Empty task");
    } else {
        for (int j = 0; j < task.length; j++) {             
            System.out.println("task["+j+"]: "+task[j]);
        }
    }
    System.out.println("============");
}

通过这种封装,您可以按如下方式更改您的 main :

public static void main(String[] args) {
    int k =1;
    String task[] = new String[12];
    CQueue q = new CQueue ();
    q.initialize(task);
    printTaskArray(task);
    q.display();
    for (int i = 0; i < task.length; i++) {
        if (task[i].equals("FULL")) {
            q.enQueue(k);
            k++;
        }
    }
    printTaskArray(task);
    q.display();
    while (true) {
        q.deleteArr(task);
        printTaskArray(task);
        q.display();
    }
}

我希望这对你有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM