C C++ Queue พื้นฐาน

Suttapak

Suttapak / September 02, 2022

3 min read––– views

คิว : Queue

  • คิวคือโครงสร้างข้อมูลที่ประกอบด้วยสมาชิกที่เรียงติดต่อกันเป็นแถว

  • เมื่อมีสมาชิกใหม่เข้าไปเสริมในคิวจะต้องเสริมจากทางด้านหลัง (rear)

  • กรณีที่นำสมาชิกออกจากคิวจะต้องนำออกจากด้านหน้า (front)

  • คิวเป็นลิสต์แบบเชิงเส้น เช่นเดียวกับสแตค แต่มีความแตกต่างกันตรงที่คิวมีตัวชี้ 2 ตัว คือ front และ rear สำหรับการใส่ข้อมูลเข้าและนำข้อมูลออก

  • ดังนั้น คิวจึงมีกระบวนการทำงานแบบ First In First Out : FIFO

    ขอส่งงานที่สองนะครับ

Queue in C++

การเพิ่มข้อมูลเข้าไปในคิว Enqueue

void enq(myQueue* q, int data){
    // เช็คว่า q เต็มละบ้อ
    if (q->rear == MAXQUEUE) {
        std::cout << "\nQueue if full" << std::endl;
        return;
    } else {
        // ถ้า q ยังไม่เต็มให้เพิ่มตำแหน่ง rear ไป 1 ตำแหน่ง
        // และเพิ่มค่าเข้าไปที่ทำแหน่ง rear
        q->rear++;
        q->arr[q->rear] = data;
        if (q->front == -1) {
            q->front = 0;
        }
    }
}

การนำข้อมูลออกจากคิว Dequeue


void deq(myQueue* q) {
    // เช็คค่าของ front และ rear ว่าเป็นค่าเริ่มต้นหรือไม่
    // ค่าเริ่มต้นจะเป็น -1
    // ถ้าเป็นค่าเร็มต้นแปลว่าไม่มีข้อมูลอยู่ในคิว
    if (q->front == -1 || q->rear == -1) {
        std::cout << "Q is empty" <<std::endl;
        return ;
    }
    if (q->front >= q->rear) {
    // ถ้า front (ข้อมูลหน้าสุด) มากกว่าหรือเท่ากับ rear (หลังสุด)
        q->arr[q->front] = NULL;
    // ลบข้อมูลและทำให้ front และ rear เป็นค่าเริ่มต้น !(ว่างเปล่า)
        q->front = -1;
        q->rear = -1;

    }else {
    // ถ้าไม่ตรงเงื่อนใขให้ลบค่า (ทำให้เป็น NULL -> ว่าง) และเพิ่มค่า front
        q->arr[q->front] = NULL;
        q->front ++;
    }
}

การแสดงผลข้อมูล display


void dp(myQueue* q) {
    std::cout << "\nDisplay Q" << std::endl;
    std::cout << "Rear -> " << q->rear  <<" Front -> "<< q->front << std::endl;
    for(int i = 0; i< q->rear+1 ; i ++) {
        std::cout << "["<< i << "] "<< " -> " << q->arr[i] << ", ";
    }
    std::cout << "\n\n";
}

code สำเร็จรูป

#include <iostream>
const int MAXQUEUE = 4;
struct myQueue {
    int arr[5];
    int rear = -1;
    int front = -1;
};

void enq(myQueue* q, int data);
void deq(myQueue* q);
void dp(myQueue* q) ;

int main() {
    myQueue myQ ;

    int menu;
    char ans = 'y';
    while (ans == 'y' || ans == 'Y') {
        std::cout << "Matee Suttapak \n " ;

        std::cout << "Pls select menu [1]:EnQueue [2]:Dequeue [3]:Show data " ;
        std::cin >> menu ;
        switch (menu) {
            case 1 :
                int data;
                std::cout << "\nInsert data : " ;
                std::cin>>data;
                enq(&myQ,data);
                break;
            case 2:
                deq(&myQ);
                break;
            case 3:
                dp(&myQ);
                std::cout << "Do you want to continue press \'Y\' to continue press another to Exit programs : ";
                std::cin >> ans ;
                continue;
            default:
                std::cout << "Pls select 1 -> 2";
                break;
        }

        std::cout << "\ndisplay Q" << std::endl;
        if (myQ.rear == -1) {
            std::cout << "\nQ is Empty." << std::endl;
        }
        for(int i = 0; i< myQ.rear+1 ; i ++) {
            std::cout << "["<< i << "] "<< " -> " << myQ.arr[i] << ", ";
        }
        std::cout << "\n\n";

        std::cout << "Do you want to continue press \'Y\' to continue press another to Exit programs : ";
        std::cin >> ans ;
    }
    return 0;
}

void enq(myQueue* q, int data){
    if (q->rear == MAXQUEUE) {
        std::cout << "\nQueue if full" << std::endl;
        return;
    } else {
        q->rear++;
        q->arr[q->rear] = data;
        if (q->front == -1) {
            q->front = 0;
        }
    }
}

void deq(myQueue* q) {
    if (q->front == -1 || q->rear == -1) {
        std::cout << "Q is empty" <<std::endl;
        return ;
    }
    if (q->front >= q->rear) {

        q->arr[q->front] = NULL;
        q->front = -1;
        q->rear = -1;

    }else {
        q->arr[q->front] = NULL;
        q->front ++;
    }
}

void dp(myQueue* q) {
    std::cout << "\nDisplay Q" << std::endl;
    std::cout << "Rear -> " << q->rear  <<" Front -> "<< q->front << std::endl;
    for(int i = 0; i< q->rear+1 ; i ++) {
        std::cout << "["<< i << "] "<< " -> " << q->arr[i] << ", ";
    }
    std::cout << "\n\n";
}