คิวหนังสือเวียนใน 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 ด้าน การพัฒนาซอฟต์แวร์แบบครบ วงจร

เตรียมความพร้อมสู่อาชีพแห่งอนาคต

อัปเกรดและ PG DIPLOMA ของ IIIT-BANGALORE ในการพัฒนาซอฟต์แวร์สแต็คเต็มรูปแบบ
ลงทะเบียนเลย