ในคิวจุดไหนคือ "หัว"?


18

ฉันมักจะคิดว่า "หัว" ของคิวเป็นองค์ประกอบถัดไปที่จะอ่านและไม่เคยถามการใช้งานนั้นจริงๆ ดังนั้นฉันจึงเขียนไลบรารีรายการที่ลิงก์ซึ่งใช้สำหรับการดูแลคิวประมวลผลคำศัพท์นั้น: เรามีlist1_headแมโครที่ดึงองค์ประกอบแรก เมื่อใช้ไลบรารีนี้ในคิวนี่จะเป็นองค์ประกอบแรกที่จะถูกลบ

แต่นักพัฒนาใหม่ในทีมเคยชินกับการใช้คิวในลักษณะอื่น เขาอธิบายถึงคิวที่ทำตัวเหมือนสุนัข: คุณเสียบที่หัวแล้วเอาที่หาง นี่เป็นคำอธิบายที่ฉลาดพอที่ฉันรู้สึกว่าการใช้งานของเขาจะต้องแพร่หลายมากขึ้นและฉันก็ไม่ได้มีคำอธิบายที่กระตุ้นอารมณ์ในการใช้งานที่ฉันต้องการ

ดังนั้นฉันเดาว่ามีคำถามที่เกี่ยวข้องสองคำถาม: 1 "หัว" ของคิวมีความหมายต่อคุณอย่างไร และ 2 ทำไมเราจึงใช้คำว่า "หัว" เพื่ออธิบายแนวคิดนั้น


1
"เขาอธิบายว่าคิวทำตัวเหมือนสุนัข" ... ฟังดูเป็นเรื่องสนุกที่จะทำงานร่วมกับผู้ชาย - อย่าปล่อยให้เขาเข้าใกล้ลูกค้า
NoChance

1
ฉันไม่รู้ แต่ฉันจะเดาได้เลยว่าคุณไม่ได้เป็นสุนัข
Izkata

อีกคำอธิบายที่ดีเกี่ยวกับความแตกต่างระหว่าง QUEUE และ STACK: http://pages.cs.wisc.edu/~mcw/cs367/lectures/stacks.html
Ythalo Rossy

นอกจากนี้ในตำราเรียนรายการที่เชื่อมโยง (โดยลำพัง) มักถูกนำมาใช้ก่อนโครงสร้างข้อมูลอื่นเช่นสแต็กและคิวและจากนั้นจะถูกสร้างขึ้นบนโครงสร้างรายการที่ลิงก์ (ซึ่งไม่จำเป็นต้องเป็นวิธีที่ต้องการสร้างโครงสร้างข้อมูลเหล่านี้ในปัจจุบัน ของแคชคิดถึง) รายการที่เชื่อมโยงมักจะมีตัวชี้หัว (หมายถึงองค์ประกอบแรก) และตัวชี้หาง (ไปยังหน้าสุดท้าย); ในการจัดเรียงนี้มันเป็นเรื่องง่ายที่จะแทรกที่ปลายหางออกจากหัว - ดังนั้นในคิว FIFO เช่นนี้คุณลบออกจากด้านหน้า แต่โปรดทราบว่านี่เป็นรายละเอียดการใช้งานภายในจริงๆ
Filip Milovanović

BTW คิดว่ามันเป็นบางส่วนที่เกี่ยวข้องกับภาษา แต่ก็เกี่ยวกับวิธีที่เราคิดในสิ่งที่คิวทำ สำหรับคนส่วนใหญ่ที่รู้ความหมายของคำว่า "คิว" หรือได้รับการแนะนำให้รู้จักกับแนวคิดที่อุปมาอุปมัย (รออยู่ในแถว) ส่วนทางออกอยู่ที่ด้านหน้า / หัว; ฉันสงสัยว่าเพื่อนของคุณมีแนวความคิดมันเหมือนสิ่งท่อส่งที่คุณผลักวัตถุที่ปลายด้านหนึ่ง (เริ่มต้นหรือในบางแง่มุม "หัว") ของท่อและพวกเขาออกจากที่ปลายอีกด้าน
Filip Milovanović

คำตอบ:


29

คุณป้อนที่ด้านหลังของคิวและออกจากด้านหน้า ในสังคมส่วนใหญ่นั่นจะบอกเป็นนัย ๆ ว่าศีรษะคือด้านหน้าและสิ่งของถูกลบออกจากหัว

Javadoc สำหรับคิวดูเหมือนว่าจะเห็นด้วยกับคำนิยามคลาสสิก (IE เดิมของคุณ):

ไม่ว่าการสั่งซื้อจะใช้ส่วนใดของส่วนหัวของคิวนั้นคือองค์ประกอบที่จะถูกลบออกโดยการโทรเพื่อลบ () หรือการสำรวจความคิดเห็น () ในคิว FIFO องค์ประกอบใหม่ทั้งหมดจะถูกแทรกที่ส่วนท้ายของคิว


4
C ++ STL เห็นด้วยเช่นกัน
Fabio Ceconello

ศัพท์ทั่วไปสำหรับ FIFO / LIFO ก็คือการลบจากด้านบนของ Queue / Stack ด้านบนของสุนัขคือหัวไม่ใช่หาง :-D
Spencer Kormos

ดูเหมือนว่าคุณจะตอบคำถามแรกมันเป็นเรื่องปกติที่การใช้งานที่ฉันเข้าใจเป็นแบบดั้งเดิม ... ขอบคุณสำหรับการอ้างอิง แต่มันก็ไม่ได้เป็นชุดเกราะเหล็กสำหรับฉันทำไมด้านหน้าของคิวเรียกว่า "หัว" ...
Aidan Cully

... ดังนั้นในปากของสุนัขที่เราเข้าคิวรายการ? ;)
ell

1
หางของสุนัขเป็นหัวของคิว
Caleb

8

สิ่งที่ผู้คนในสหรัฐอเมริกาเรียกกันทั่วไปว่าสายในขณะที่คุณยืนอยู่ที่ที่ทำการไปรษณีย์คนในประเทศที่ใช้ภาษาอังกฤษอื่น ๆ เรียกคิว ดังนั้นจึงเป็นเรื่องง่ายสำหรับคนอเมริกันที่จะรักษาคำศัพท์ให้ตรงถ้าคุณแทนที่ "line" สำหรับ "queue" กล่าวอีกนัยหนึ่งเมื่อคุณอยู่ในหัวหรือด้านหน้าของบรรทัดคุณเป็นคนถัดไปที่จะถูกเรียก


บางทีนี่อาจเป็นคำถามที่เกี่ยวกับภาษาอังกฤษมากกว่านั้นเพราะปัญหาที่ดูเหมือนว่าจะเกิดขึ้นคือ "ทำไมเราถึงเรียกหน้าหัว"
Aidan Cully

3
@AidanCully: เพราะหัวบนร่างกายคือ (ในสี่เท่าและสัตว์อื่น ๆ ที่มุ่งเน้นแนวนอน) ไปข้างหน้าหรือด้านหน้า
outis

นั่นเป็นคำอธิบายที่ดีที่สุดสำหรับเราชาวอเมริกัน
andDevW

4

การประชุมทั้งสองเป็นการใช้งานทั่วไป จากประสบการณ์ของฉันเมื่อพูดถึงคิวโดยทั่วไปองค์ประกอบส่วนหัวเป็นส่วนต่อไปที่จะออกมาจากคิวและส่วนท้ายคือส่วนที่องค์ประกอบเข้าสู่คิว สิ่งนี้สอดคล้องกับการใช้ภาษาอังกฤษทุกวัน - เราเข้าแถวกันด้านหลังและสิ่งต่อไปที่จะเสิร์ฟคือที่ด้านหน้าหรือหัว (และถ้าคุณตัดมันก็อยู่ที่ด้านหลังของบรรทัดสำหรับคุณ!)

อย่างไรก็ตามเมื่อคิว (aka FIFO) ถูกนำมาใช้เป็นบัฟเฟอร์แหวนคำมักจะย้อนกลับเพราะส่วนที่ใช้ของบัฟเฟอร์แหวนคล้ายกับงูไปรอบ ๆ สมมติว่างูเคลื่อนที่ไปข้างหน้าหัวเป็นจุดสิ้นสุดตามธรรมชาติที่นำการเคลื่อนไหวซึ่งเป็นจุดสิ้นสุดที่มีการแทรกรายการที่เข้ามา


เป็นมูลค่าการกล่าวขวัญบัฟเฟอร์วงกลมในเคอร์เนล Linuxซึ่งใช้การประชุมที่รายการจะถูกเพิ่มที่หัวและลบที่ท้าย
Craig McQueen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.