C C++ Queue พื้นฐาน
Suttapak / September 02, 2022
3 min read • ––– views
คิว : Queue
-
คิวคือโครงสร้างข้อมูลที่ประกอบด้วยสมาชิกที่เรียงติดต่อกันเป็นแถว
-
เมื่อมีสมาชิกใหม่เข้าไปเสริมในคิวจะต้องเสริมจากทางด้านหลัง (rear)
-
กรณีที่นำสมาชิกออกจากคิวจะต้องนำออกจากด้านหน้า (front)
-
คิวเป็นลิสต์แบบเชิงเส้น เช่นเดียวกับสแตค แต่มีความแตกต่างกันตรงที่คิวมีตัวชี้ 2 ตัว คือ front และ rear สำหรับการใส่ข้อมูลเข้าและนำข้อมูลออก
-
ดังนั้น คิวจึงมีกระบวนการทำงานแบบ First In First Out : FIFO
ขอส่งงานที่สองนะครับ
การเพิ่มข้อมูลเข้าไปในคิว 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";
}