簡體   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