คิวหนังสือเวียนใน C: จะนำไปใช้อย่างไร
เผยแพร่แล้ว: 2020-10-23ข้อมูลถูกจัดเรียงในคิวแบบวงกลมในรูปแบบวงกลมที่องค์ประกอบสุดท้ายเชื่อมต่อกับองค์ประกอบแรก ไม่เหมือนกับคิวเชิงเส้นตรงที่งานถูกดำเนินการบน FIFO (เข้าก่อนออกก่อน) ลำดับคิวแบบวงกลมของการดำเนินการงานอาจเปลี่ยนแปลงได้ การดำเนินการแทรกและลบสามารถทำได้ในตำแหน่งใดก็ได้
คิวแบบวงกลมมีประสิทธิภาพมากกว่าคิวแบบเส้นตรง ในการแสดงภาพแบบกราฟิกของคิวแบบวงกลม คุณสามารถสังเกตได้ว่าตำแหน่งด้านหน้าและด้านหลังเชื่อมต่อกัน ทำให้เป็นวงกลมที่มีการดำเนินการตาม FIFO เสมอ ทุกองค์ประกอบใหม่จะถูกเพิ่มที่ส่วนท้ายและลบออกจากส่วนหน้า คิวแบบวงกลมมีการใช้ประโยชน์ที่ดีขึ้นและมีเวลาที่ซับซ้อนของ O(1)
แหล่งที่มา
สารบัญ
แอปพลิเคชันของคิวหนังสือเวียน
- CPU Scheduling: คิวแบบวงกลมใช้พื้นที่หน่วยความจำว่างที่พบในคิวเชิงเส้น
- ระบบจราจร: ในระบบจราจร ด้วยความช่วยเหลือของคิวแบบวงกลม ไฟจราจรจะทำงานตามช่วงเวลาที่กำหนด
- การจัดการหน่วยความจำ: ระบบปฏิบัติการมักจะติดตามกระบวนการที่เตรียมดำเนินการหรือกำลังรอเหตุการณ์เฉพาะที่จะเกิดขึ้น
เรียนรู้: โปรแกรม C สำหรับการเรียงลำดับฟอง: การเรียงลำดับฟองในC
โค้ดตัวอย่างพร้อมคำอธิบาย
บรรทัดที่ 1: // (1) ตัวประมวลผลล่วงหน้า
บรรทัดที่ 2: // ตั้งค่าจำกัดคิวเป็น 5 องค์ประกอบ

บรรทัดที่ 3: #include<stdio.h>
บรรทัดที่ 4: #define LIM 5
บรรทัดที่ 5: // (2) ประกาศประเภทข้อมูลคิว
บรรทัดที่ 6: // data เก็บข้อมูล; delPos ตำแหน่งที่จะลบจาก; ความยาวไม่มี ของ
บรรทัดที่ 7: // องค์ประกอบปัจจุบันอยู่ในคิว
บรรทัดที่ 8: คิวโครงสร้าง typedef {
บรรทัดที่ 9: int data[LIM], delPos, length;
บรรทัดที่ 10: } Q;
บรรทัดที่ 11: // (3) ประกาศระดับโลก
บรรทัดที่ 12: // ฟังก์ชัน & ตัวแปรส่วนกลาง q ของประเภทคิว struct
บรรทัดที่ 13: Q q;
บรรทัดที่ 14: void ui_Q_Ops(), insertQel(), deleteQel(), displayQels(), initQ();
บรรทัดที่ 15: // (4) เรียกใช้ฟังก์ชัน UI หลังจากเริ่มต้น
บรรทัดที่ 16: int main()
บรรทัดที่ 17: {
บรรทัดที่ 18: initQ();
บรรทัดที่ 19: ui_Q_Ops();
บรรทัดที่ 20: คืนค่า 0;
บรรทัดที่ 21: }
บรรทัดที่ 22: // (5) เริ่มต้นคิว
บรรทัดที่ 23: โมฆะ initQ()
บรรทัดที่ 24: {
บรรทัดที่ 25: q.length = 0;
บรรทัดที่ 26: q.delPos = 0;
บรรทัดที่ 27: }
บรรทัดที่ 28: // (6) Menu Driven Loop เรียกฟังก์ชันที่ถูกต้อง
บรรทัดที่ 29: ถือเป็นโมฆะ ui_Q_Ops()
บรรทัดที่ 30: {
บรรทัดที่ 31: int ตัวเลือก=0;
บรรทัดที่ 32: ใส่ถ่าน [16];
บรรทัดที่ 33: while(choice!=4){
บรรทัดที่ 34: printf(” \n ———-\n “);
บรรทัดที่ 35: printf(” 1. แทรกลงในคิว \n “);
บรรทัดที่ 36: printf(” 2. ลบออกจากคิว \n “);
บรรทัดที่ 37: printf(” 3. แสดงรายการคิว \n “);
บรรทัดที่ 38: printf(” 4. ออกจากโปรแกรม \n “);
บรรทัดที่ 39: printf(” Enter choice : “);
บรรทัดที่ 40: if (fgets(input, 15, stdin) != NULL){
บรรทัดที่ 41: if (sscanf(input, “%d”, &choice) == 1){
บรรทัดที่ 42: สวิตช์ (ตัวเลือก){
บรรทัดที่ 43: กรณีที่ 1: insertQel();
บรรทัดที่ 44: แตก;
บรรทัดที่ 45: กรณีที่ 2: deleteQel();
บรรทัดที่ 46: แตก;
บรรทัดที่ 47: กรณีที่ 3: displayQels();
บรรทัดที่ 48: แตก;
บรรทัดที่ 49: กรณีที่ 4: ส่งคืน;
บรรทัดที่ 50: ค่าเริ่มต้น: printf("ตัวเลือกไม่ถูกต้อง\n ");
บรรทัด 51: ดำเนินการต่อ;
บรรทัด 52: }
บรรทัด 53: } else
บรรทัดที่ 54: printf(” ตัวเลือกไม่ถูกต้อง \n “);
สาย 55: }
สาย 56: }
บรรทัด 57: }
บรรทัดที่ 58: // (7) แทรกลงใน Queue
Line 59: // ถ้าความยาวเท่ากับ MAX Limit คิวเต็ม มิฉะนั้นให้แทรก
บรรทัดที่ 60: // บรรลุเป็นวงกลมด้วยความยาวรวมและโมดูลัส delPos โดย MAX Limit
บรรทัดที่ 61: // และความยาวที่เพิ่มขึ้น
บรรทัดที่ 62: ถือเป็นโมฆะ insertQel()
สาย 63: {
บรรทัดที่ 64: int el, inspos;
บรรทัดที่ 65: ใส่ถ่าน [16];
บรรทัดที่ 66: if (q.length == LIM){
บรรทัดที่ 67: printf(” คิวเต็ม \n “);
บรรทัดที่ 68: กลับ;
สาย 69: }
บรรทัดที่ 70: inspos = (q.delPos + q.length) % LIM;
บรรทัดที่ 71: printf(” ป้อนองค์ประกอบที่จะแทรก: “);
บรรทัดที่ 72: if (fgets(input, 15, stdin) != NULL){
บรรทัดที่ 73: if (sscanf(input, “%d”, &el)){
บรรทัดที่ 74: q.data[inspos] = el;
บรรทัดที่ 75: q.length++;
บรรทัด 76: } else
บรรทัดที่ 77: printf(” อินพุตไม่ถูกต้อง \n “);
บรรทัด 78: }
สาย 79: }
บรรทัดที่ 80: // (8) ลบออกจากคิว
บรรทัดที่ 81: // ถ้าความยาวเป็น 0 คิวจะว่างเปล่า มิฉะนั้น ให้ลบที่ delPos
บรรทัดที่ 82: // และลดความยาว
บรรทัดที่ 83: ถือเป็นโมฆะ deleteQel()

สาย 84: {
บรรทัดที่ 85: if (q.length == 0){
บรรทัดที่ 86: printf(” คิวว่าง \n “);
บรรทัดที่ 87: } อื่นๆ {
บรรทัดที่ 88: printf(” องค์ประกอบที่ถูกลบ %d \n “, q.data[q.delPos]);
บรรทัดที่ 89: q.delPos = (q.delPos + 1) % LIM;
บรรทัดที่ 90: q.length–;
บรรทัดที่ 91: }
บรรทัดที่ 92: }
บรรทัดที่ 93: // (9) แสดงองค์ประกอบคิว
บรรทัดที่ 94: // แสดงเป็นวงกลมโดยวนเป็นวงเริ่มต้นที่ delPos
บรรทัดที่ 95: // และเพิ่มตัววนซ้ำและโมดูลัสโดย Max Limit
บรรทัดที่ 96: เป็นโมฆะ displayQels()
บรรทัดที่ 97: {
บรรทัดที่ 98: int i;
บรรทัดที่ 99: if (q.length == 0){
บรรทัดที่ 100: printf(” คิวว่างเปล่า \n “);
บรรทัดที่ 101: } อื่นๆ {
บรรทัดที่ 102: printf(” องค์ประกอบของคิวคือ: “);
บรรทัดที่ 103: for(i = 0; i < q.length; i++){
บรรทัดที่ 104: printf(“%d “, q.data[(q.delPos+i)%LIM]);
บรรทัด 105: }
บรรทัดที่ 106: printf(” \n “);
บรรทัด 107: }
บรรทัด 108: }
สาย 109:
ผลลัพธ์:
การดำเนินงานในคิวหนังสือเวียน
1. insertQel() – การแทรกองค์ประกอบลงใน Circular Queue
ในคิวแบบวงกลม ฟังก์ชัน enQueue() ใช้เพื่อแทรกองค์ประกอบลงในคิวแบบวงกลม ในคิวแบบวงกลม คุณลักษณะใหม่จะถูกแทรกในตำแหน่งด้านหลังเสมอ ฟังก์ชัน enQueue() ใช้ค่าจำนวนเต็มหนึ่งค่าเป็นพารามิเตอร์และแทรกลงในคิวแบบวงกลม มีการใช้งานขั้นตอนต่อไปนี้เพื่อแทรกองค์ประกอบลงในคิวแบบวงกลม:
ขั้นตอนที่ 1 – ตรวจสอบว่าความยาวเท่ากับ MAX Limit หรือไม่ ถ้าเป็นจริงแสดงว่าคิวเต็ม หากเป็น FULL ให้แสดง ” Queue is full ” และยุติฟังก์ชัน
ขั้นตอนที่ 2 – หากไม่เต็ม ให้ใส่ค่าที่ได้เป็นวงกลมด้วยความยาวรวมและโมดูลัส delPos โดย MAX Limit และความยาวที่เพิ่มขึ้น
2. deleteQel() – การลบองค์ประกอบออกจาก Circular Queue
ในคิวแบบวงกลม deQueue() เป็นฟังก์ชันที่ใช้ในการลบองค์ประกอบออกจากคิวแบบวงกลม ในคิวแบบวงกลม องค์ประกอบจะถูกลบออกจากตำแหน่งด้านหน้าเสมอ ฟังก์ชัน deQueue() ไม่ใช้ค่าใด ๆ เป็นพารามิเตอร์ มีการใช้งานขั้นตอนต่อไปนี้เพื่อลบองค์ประกอบออกจากคิวแบบวงกลม...
ขั้นตอนที่ 1 – ตรวจสอบว่าคิวว่างหรือไม่ (หน้า == -1 && หลัง == -1)
ขั้นตอนที่ 2 – หากว่างเปล่า ให้แสดง "คิวว่างเปล่า" และยุติฟังก์ชัน
ขั้นตอนที่ 3 – หากไม่ว่างเปล่า ให้แสดงองค์ประกอบที่ถูกลบตามตำแหน่ง หลังจากเพิ่มทุกองค์ประกอบแล้ว ให้ไปยังตำแหน่งถัดไปที่จำกัดคิวม็อด
3. displayQels() – แสดงองค์ประกอบคิวที่มีอยู่ในคิวแบบวงกลม ขั้นตอนต่อไปนี้ถูกนำมาใช้เพื่อแสดงองค์ประกอบของคิวแบบวงกลม:
ขั้นตอนที่ 1 – ตรวจสอบว่าคิวว่างหรือไม่
ขั้นตอนที่ 2 – หากความยาวเป็น 0 แสดงว่าเป็น EMPTY ให้แสดง "คิวว่างเปล่า" และยุติฟังก์ชัน
ขั้นตอนที่ 3 – หากไม่ว่าง ให้กำหนดตัวแปรจำนวนเต็ม 'i'
ขั้นตอนที่ 4 – ตั้งค่า i เป็น 0
ขั้นตอนที่ 5 – อีกครั้ง แสดงองค์ประกอบตามตำแหน่งและมูลค่าที่เพิ่มขึ้นทีละหนึ่ง (i++) ทำซ้ำเหมือนเดิมจนกว่า 'i <q.length' จะกลายเป็น FALSE
สามารถใช้ Circular Queue ได้โดยใช้รายการเชื่อมโยงเช่นกัน ต่อไปนี้เป็นอัลกอริทึม:
- อัลกอริทึมสำหรับ Enqueue:
if (FRONT == NULL) // การแทรกในคิวว่าง
FRONT = REAR = โหนดใหม่
สิ้นสุด if
อื่น
REAR -> next = newNode // การแทรกหลังองค์ประกอบสุดท้าย
REAR = โหนดใหม่
จบอย่างอื่น
REAR -> ถัดไป = FRONT
สิ้นสุดการเข้าคิว
- อัลกอริทึมสำหรับ Dequeue:
if(FRONT == NULL) // เงื่อนไขสำหรับอันเดอร์โฟลว์
พิมพ์ “คิวอันเดอร์โฟลว์”
สิ้นสุด Dequeue
สิ้นสุด if
else if(FRONT == REAR) // คิวมีโหนดเดียวเท่านั้น
temp = FRONT -> data
ฟรี (ชั่วคราว)
FRONT = FRONT -> ถัดไป
REAR -> ถัดไป = FRONT
สิ้นสุด if
else if (FRONT == N – 1) // ถ้า FRONT เป็นโหนดสุดท้าย
front = 0 // ทำให้ FRONT เป็นโหนดแรก
สิ้นสุด if
สิ้นสุด Dequeue

อ่านเพิ่มเติม: Python Vs C: การเปรียบเทียบแบบสมบูรณ์แบบเคียงข้างกัน
บทสรุป
โครงสร้างข้อมูลและอัลกอริทึมมีความสำคัญอย่างยิ่ง ไม่ใช่แค่ในการเขียนโปรแกรม C เท่านั้น แต่ยังรวมถึงภาษาอื่นๆ ด้วย คุณค่าของมันไม่เคยมีมาก่อน และสำหรับหัวข้อที่มีความสำคัญดังกล่าว จะดีกว่าที่จะลงทุนในหลักสูตรที่ออกแบบและให้คำปรึกษาโดยผู้เชี่ยวชาญ ซึ่งจะช่วยเพิ่มมูลค่าที่ดีเยี่ยมให้กับผลงานของคุณ upGrad เสนอหลักสูตรที่เต็มไปด้วยพลังมากมายที่ไม่เพียงแต่เพิ่มพูนทักษะของคุณ แต่ยังสร้างเสาหลักที่แข็งแกร่งของพื้นฐานอีกด้วย
ได้รับการออกแบบโดย IIIT-B ที่มีชื่อเสียงอย่างมาก ซึ่งไม่เพียงแต่ให้เนื้อหาคุณภาพระดับพรีเมียมเท่านั้น แต่ยังทำให้คุณเป็นส่วนหนึ่งของเครือข่ายที่แข็งแกร่ง ซึ่งคุณจะเชื่อมต่อกับผู้คนที่กำลังพัฒนาในเส้นทางอาชีพเดียวกันรวมถึงผู้เชี่ยวชาญในอุตสาหกรรมที่ ไขข้อสงสัยและสนับสนุนคุณทุกครั้ง
ทำความรู้จักกับความคิดและกระบวนการคิดของพวกเขาจะช่วยคุณได้ และสิ่งหนึ่ง ที่คุณจะได้รับจาก upGrad ก็คือคุณสามารถเลือกใช้ตัวเลือก EMI และใช้จ่ายสบายกระเป๋าของคุณ
เราหวังว่าคุณจะมีโอกาสเรียนรู้ที่ยอดเยี่ยมในการดำเนินโครงการ C เหล่านี้ หากคุณสนใจที่จะเรียนรู้เพิ่มเติมและต้องการคำปรึกษาจากผู้เชี่ยวชาญในอุตสาหกรรม โปรดดูประกาศนียบัตร PG ของ Grad & IIIT Banglore ด้าน การพัฒนาซอฟต์แวร์แบบครบ วงจร