ความแตกต่างพื้นฐานระหว่างสแต็กและคิวคืออะไร?


130

ความแตกต่างพื้นฐานระหว่าง stack กับ que คืออะไร ??

โปรดช่วยฉันด้วยฉันไม่พบความแตกต่าง

วิธีการทำคุณความแตกต่างและสแต็คคิว?

ฉันค้นหาคำตอบในลิงค์ต่างๆและพบคำตอบนี้ ..

ในการเขียนโปรแกรมระดับสูง

สแต็กถูกกำหนดให้เป็นรายการหรือลำดับขององค์ประกอบที่ยาวขึ้นโดยการวางองค์ประกอบใหม่ "ที่ด้านบน" ขององค์ประกอบที่มีอยู่และทำให้สั้นลงโดยการลบองค์ประกอบออกจากด้านบนขององค์ประกอบที่มีอยู่ เป็น ADT [ชนิดข้อมูลบทคัดย่อ] ที่มีการคำนวณทางคณิตศาสตร์เป็น "push" และ "pop"

คิวคือลำดับขององค์ประกอบที่ถูกเพิ่มเข้าไปโดยการวางองค์ประกอบใหม่ไว้ที่ด้านหลังของที่มีอยู่และทำให้สั้นลงโดยการลบองค์ประกอบที่อยู่ด้านหน้าคิว มันเป็น ADT [ชนิดข้อมูลบทคัดย่อ] มีคำศัพท์เหล่านี้ที่เข้าใจมากขึ้นในการเขียนโปรแกรม Java, C ++, Python และอื่น ๆ

ฉันขอคำตอบที่ละเอียดกว่านี้ได้ไหม โปรดช่วยฉันด้วย


12
ดูเหมือนว่าคุณจะตอบคำถามของคุณเองแล้วสแต็กคือคอนเทนเนอร์ Last-In First-Out (LIFO) และคิวคือคอนเทนเนอร์ First-In First-Out (FIFO)
Iridium

คำตอบ:


151

Stackเป็นโครงสร้างข้อมูล LIFO (อยู่ในอันดับแรกก่อนออก) ลิงก์ที่เกี่ยวข้องไปยังวิกิพีเดียมีคำอธิบายและตัวอย่างโดยละเอียด

Queueคือโครงสร้างข้อมูล FIFO (เข้าก่อนออกก่อน) ลิงก์ที่เกี่ยวข้องไปยังวิกิพีเดียมีคำอธิบายและตัวอย่างโดยละเอียด


131

ลองนึกภาพกระดาษ ชิ้นสุดท้ายที่ใส่ลงในกองอยู่ด้านบนดังนั้นจึงเป็นชิ้นแรกที่ออกมา นี่คือLIFO การเพิ่มกระดาษเรียกว่า "ดัน" และการนำกระดาษออกเรียกว่า "popping"

ลองนึกภาพคิวที่ร้าน คนแรกในสายคือคนแรกที่ออกจากแถว นี่คือFIFO บุคคลที่เข้าแถวจะถูก "จัดคิว" และบุคคลที่เข้าแถวจะถูก "ออกจากคิว"


3
หนึ่งในการเปรียบเทียบที่ดีที่สุดที่ฉันคิดได้
Yeikel

83

แบบจำลองภาพ

กองแพนเค้ก (LIFO)

วิธีเดียวที่จะเพิ่มหนึ่งและ / หรือลบอย่างใดอย่างหนึ่งคือจากด้านบน

กองแพนเค้ก

คิวบรรทัด (FIFO)

เมื่อมาถึงพวกเขาจะมาถึงท้ายคิวและเมื่อคนหนึ่งออกจากหน้าคิว

เส้น dmv

ข้อเท็จจริงที่น่าสนใจ:ชาวอังกฤษอ้างถึงกลุ่มคนเป็นคิว


6
Jee นี่ต้องเป็นคำตอบ imo ขอบคุณ @Jacksonkr
Kulasangar

ฮ่าฮ่าแน่ใจว่านี่เป็นคำอธิบายที่สมบูรณ์แบบของ Queue and Stack แต่เพื่อประโยชน์ในการโต้แย้งถ้าฉันต้องการแพนเค้กชิ้นแรกเพิ่มลงในจานล่ะ ฉันรู้ว่าสิ่งนี้สามารถทำได้ด้วย stack.size () เทียบกับ if (! stack.isEmpty ()) แต่แพนเค้กชิ้นแรกอาจจะดีที่สุด :) ... ไม่ว่าจะด้วยวิธีใดคำตอบที่ดีและฉันยอมรับว่านี่คือ ที่ชัดเจนที่สุด ... ดูเหมือนว่าน่าสนใจที่ชาวอังกฤษอ้างถึงเส้นเป็นคิว (ถ้าถูกต้อง) ในภาษาที่ไม่ใช่โปรแกรมฉันยังคงพิจารณาว่าบรรทัดที่รายการแรกจะออกก่อน (หลังจากออกจากบรรทัด / คิว )
ViaTech

เดี๋ยวก่อนเขาไม่เรียกว่าคิวที่อื่นเหรอ?
เที่ยว

37

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

สำหรับสแต็กถ้าฉันมีรายการa, b, cและฉันเพิ่มdมันจะถูกตรึงในตอนท้ายดังนั้นฉันจึงลงเอยด้วยa,b,c,d. dถ้าผมต้องการที่จะปรากฏองค์ประกอบของรายการผมลบองค์ประกอบสุดท้ายที่ผมเพิ่มซึ่งเป็น หลังจากป๊อปรายการของฉันก็a,b,cกลับมาอีกครั้ง

สำหรับคิวฉันเพิ่มองค์ประกอบใหม่ในลักษณะเดียวกัน a,b,cกลายเป็นหลังจากที่เพิ่มa,b,c,d dแต่ตอนนี้เมื่อฉัน pop b,c,dผมต้องใช้องค์ประกอบจากด้านหน้าของรายการดังนั้นมันจะกลายเป็น

ง่ายมาก!


14

คิว

คิวคือรายการสั่งซื้อ

รายการจะถูกลบที่ปลายด้านหนึ่งที่เรียกว่า 'front' end ของคิว

รายการจะถูกแทรกที่ปลายอีกด้านที่เรียกว่า 'ด้านหลัง' ของคิว

รายการแรกที่แทรกคือรายการแรกที่จะถูกลบออก (FIFO)

ซ้อนกัน

Stack คือการรวบรวมสิ่งของต่างๆ

อนุญาตให้เข้าถึงรายการข้อมูลเพียงรายการเดียว: รายการสุดท้ายที่แทรก

รายการจะถูกแทรกและลบที่ปลายด้านหนึ่งเรียกว่า 'ด้านบนสุดของสแต็ก'

เป็นวัตถุที่ไม่หยุดนิ่งและเปลี่ยนแปลงตลอดเวลา

รายการข้อมูลทั้งหมดวางอยู่ด้านบนของสแต็กและนำออกจากด้านบน

โครงสร้างของการเข้าถึงนี้เรียกว่าโครงสร้าง Last in First out (LIFO)


โดยพื้นฐานแล้ว 'คิว' คือ "FIFO" - อันดับแรกอยู่ในลำดับแรก ในขณะที่ 'stack' เป็น "LIFO" - อยู่ในลำดับแรก ฉันถูกไหม?
Sebastian Nielsen

@SebastianNielsen ใช่ถูกต้องตามที่ระบุไว้ในคำตอบ
Dissanayake

แต่อะไรคือความแตกต่างระหว่างรายการที่เชื่อมโยงกับสแต็ก? ไม่เหมือนกันเหรอ
Sebastian Nielsen

@SebastianNielsen สแต็กคือ ADT ซึ่งหมายความว่ามันแสดงส่วนต่อประสานซึ่งเป็นการดำเนินการแบบพุชและป๊อป แต่กลไกพื้นฐาน (การนำไปใช้งาน) ถูกซ่อนจากผู้ใช้ปลายทาง กองซ้อนสามารถนำไปใช้กับอาร์เรย์หรือกับรายการที่เชื่อมโยง
gdyrrahitis

13

ซ้อนกัน:

  1. Stack ถูกกำหนดให้เป็นรายการขององค์ประกอบที่เราสามารถแทรกหรือลบองค์ประกอบที่ด้านบนของสแต็กเท่านั้น
  2. ลักษณะการทำงานของสแต็กก็เหมือนกับระบบ Last-In First-Out (LIFO)
  3. Stack ใช้เพื่อส่งผ่านพารามิเตอร์ระหว่างฟังก์ชัน ในการเรียกใช้ฟังก์ชันพารามิเตอร์และตัวแปรโลคัลจะถูกเก็บไว้ในสแตก
  4. ภาษาโปรแกรมระดับสูงเช่น Pascal, c ฯลฯ ที่ให้การสนับสนุนการเรียกซ้ำใช้ stack สำหรับการทำบัญชี โปรดจำไว้ว่าในการเรียกซ้ำแต่ละครั้งจำเป็นต้องบันทึกค่าปัจจุบันของพารามิเตอร์ตัวแปรโลคัลและที่อยู่สำหรับส่งคืน (ที่อยู่ที่ตัวควบคุมต้องส่งคืนหลังจากการเรียก)

คิว:

  1. คิวคือชุดขององค์ประกอบประเภทเดียวกัน เป็นรายการเชิงเส้นที่การแทรกสามารถเกิดขึ้นที่ส่วนท้ายด้านหนึ่งของรายการเรียกว่าด้านหลังของรายการและการลบจะเกิดขึ้นได้ที่ปลายอีกด้านหนึ่งเท่านั้นที่เรียกว่าส่วนหน้าของรายการ
  2. ลักษณะการทำงานของคิวก็เหมือนกับระบบเข้าก่อนออกก่อน (FIFO)

ฉันค่อนข้างแน่ใจว่าคุณสามารถแทรกในตอนท้ายหรือจุดเริ่มต้นของสแต็คได้เช่นกันฉันคิดว่าสิ่งสำคัญที่ควรทราบคือ FIFO เทียบกับ LIFO
ไมค์

6

สแต็กคือชุดขององค์ประกอบซึ่งสามารถจัดเก็บและเรียกดูได้ทีละรายการ องค์ประกอบจะถูกเรียกดูตามลำดับย้อนกลับของเวลาในการจัดเก็บกล่าวคือองค์ประกอบล่าสุดที่จัดเก็บเป็นองค์ประกอบถัดไปที่จะเรียกคืน สแต็กบางครั้งเรียกว่าโครงสร้าง Last-In-First-Out (LIFO) หรือ First-In-Last-Out (FILO) ไม่สามารถดึงข้อมูลองค์ประกอบที่จัดเก็บไว้ก่อนหน้านี้ได้จนกว่าจะดึงองค์ประกอบล่าสุด (โดยปกติเรียกว่าองค์ประกอบ "ด้านบน")

คิวคือชุดขององค์ประกอบซึ่งสามารถจัดเก็บและเรียกดูได้ทีละรายการ องค์ประกอบจะถูกเรียกตามลำดับเวลาในการจัดเก็บกล่าวคือองค์ประกอบแรกที่จัดเก็บคือองค์ประกอบถัดไปที่จะเรียกคืน บางครั้งคิวเรียกว่าโครงสร้าง First-In-First-Out (FIFO) หรือ Last-In-Last-Out (LILO) ไม่สามารถเรียกใช้องค์ประกอบที่จัดเก็บในภายหลังได้จนกว่าจะดึงข้อมูลองค์ประกอบแรก (โดยปกติเรียกว่าองค์ประกอบ "ด้านหน้า")


2

STACK: Stack ถูกกำหนดให้เป็นรายการขององค์ประกอบที่เราสามารถแทรกหรือลบองค์ประกอบที่ด้านบนของสแต็กเท่านั้น

Stack ใช้เพื่อส่งผ่านพารามิเตอร์ระหว่างฟังก์ชัน ในการเรียกใช้ฟังก์ชันพารามิเตอร์และตัวแปรโลคัลจะถูกเก็บไว้ในสแตก

สแต็กคือชุดขององค์ประกอบซึ่งสามารถจัดเก็บและเรียกดูได้ทีละรายการ องค์ประกอบจะถูกเรียกดูตามลำดับย้อนกลับของเวลาในการจัดเก็บกล่าวคือองค์ประกอบล่าสุดที่จัดเก็บเป็นองค์ประกอบถัดไปที่จะเรียกคืน สแต็กบางครั้งเรียกว่าโครงสร้าง Last-In-First-Out (LIFO) หรือ First-In-Last-Out (FILO) ไม่สามารถดึงข้อมูลองค์ประกอบที่จัดเก็บไว้ก่อนหน้านี้ได้จนกว่าจะดึงองค์ประกอบล่าสุด (โดยปกติเรียกว่าองค์ประกอบ "ด้านบน")

คิว:

คิวคือชุดขององค์ประกอบประเภทเดียวกัน เป็นรายการเชิงเส้นที่การแทรกสามารถเกิดขึ้นที่ส่วนท้ายด้านหนึ่งของรายการเรียกว่าด้านหลังของรายการและการลบจะเกิดขึ้นที่ส่วนอื่น ๆ เท่านั้นเรียกว่าส่วนหน้าของรายการ

คิวคือชุดขององค์ประกอบซึ่งสามารถจัดเก็บและเรียกดูได้ทีละรายการ องค์ประกอบจะถูกเรียกตามลำดับเวลาในการจัดเก็บกล่าวคือองค์ประกอบแรกที่จัดเก็บคือองค์ประกอบถัดไปที่จะเรียกคืน บางครั้งคิวเรียกว่าโครงสร้าง First-In-First-Out (FIFO) หรือ Last-In-Last-Out (LILO) ไม่สามารถเรียกใช้องค์ประกอบที่จัดเก็บในภายหลังได้จนกว่าจะดึงข้อมูลองค์ประกอบแรก (โดยปกติเรียกว่าองค์ประกอบ "ด้านหน้า")


2

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

เมื่อทำงานกับสแต็ก

  • คุณใส่องค์ประกอบที่ปลายด้านหนึ่งของโซ่และ
  • คุณดึงและ / หรือลบองค์ประกอบจากปลายสายเดียวกัน

ในขณะที่มีคิว

  • คุณใส่องค์ประกอบที่ปลายด้านหนึ่งของโซ่และ
  • คุณดึง / ลบออกจากปลายอีกด้านหนึ่ง

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

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

ในกรณีส่วนใหญ่แม้ว่าจะเป็นค่าหรือตำแหน่งหน่วยความจำ (เช่นตัวชี้) และส่วนที่เหลือก็ซ่อนความจริงนี้ไว้เบื้องหลังศัพท์แสงภาษา <

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

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

สุดท้ายนี้คุณควรทราบว่ามีคำอื่น ๆ ที่ใช้ในแนวคิดเดียวกันนี้ ตัวอย่างเช่นสแต็กอาจเรียกว่าฮีป นอกจากนี้ยังมีแนวคิดเหล่านี้ในเวอร์ชันไฮบริดตัวอย่างเช่นคิวแบบปลายคู่สามารถทำงานพร้อมกันเป็นสแต็กและเป็นคิวได้เนื่องจากสามารถเข้าถึงได้โดยปลายทั้งสองข้างพร้อมกัน นอกจากนี้ความจริงที่ว่าโครงสร้างข้อมูลถูกจัดเตรียมให้คุณเป็นสแต็กหรือเป็นคิวนั้นไม่จำเป็นต้องหมายความว่ามีการใช้งานเช่นนี้มีบางกรณีที่โครงสร้างข้อมูลสามารถนำไปใช้เป็นอะไรก็ได้และจัดให้เป็นแบบเฉพาะ โครงสร้างข้อมูลเพียงเพราะสามารถสร้างพฤติกรรมเช่นนี้ได้ กล่าวอีกนัยหนึ่งคือหากคุณให้วิธีการพุชและป๊อปกับโครงสร้างข้อมูลใด ๆ สิ่งเหล่านี้จะกลายเป็นกองซ้อนอย่างน่าอัศจรรย์!


อย่าใช้การจัดรูปแบบรหัสสำหรับข้อความที่ไม่ใช่รหัส
Marquis of Lorne

1

STACK เป็นรายการ LIFO (เข้าก่อนออกก่อน) หมายความว่าสมมติว่า 3 องค์ประกอบถูกแทรกในสแต็กคือ 10,20,30 10 ถูกแทรกก่อนและแทรก 30 ครั้งสุดท้ายดังนั้น 30 จะถูกลบออกจากสแต็กก่อนและ 10 จะถูกลบล่าสุดจากสแต็กนี่คือรายการ LIFO (Last In First Out)

QUEUE คือรายการ FIFO (เข้าก่อนออกก่อน) หมายความว่ามีการแทรกองค์ประกอบหนึ่งก่อนซึ่งจะถูกลบออกก่อนคิวของประชาชน


1

จัดเรียงคอลเลกชันแนวตั้งที่พิจารณาแล้ว ก่อนอื่นให้ทำความเข้าใจว่าคอลเล็กชันคือ OBJECT ที่รวบรวมและจัดระเบียบ OBJECTS อื่น ๆ ที่มีขนาดเล็กกว่า OBJECTS ขนาดเล็กเหล่านี้มักเรียกกันว่าองค์ประกอบ องค์ประกอบเหล่านี้ "ถูกผลัก" บนสแต็กตามลำดับ ABC โดยที่ A อยู่ก่อนและ C อยู่สุดท้าย ในแนวตั้งจะมีลักษณะดังนี้: เพิ่มองค์ประกอบที่ 3) เพิ่มองค์ประกอบที่ 2) B เพิ่มองค์ประกอบที่ 1) A

สังเกตว่า "A" ที่ถูกเพิ่มเข้าไปในสแต็กเป็นครั้งแรกจะอยู่ด้านล่าง หากคุณต้องการลบ "A" ออกจากสแต็กก่อนอื่นคุณต้องลบ "C" ตามด้วย "B" และสุดท้ายคือองค์ประกอบเป้าหมาย "A" สแต็กต้องใช้วิธี LIFO ในขณะที่จัดการกับความซับซ้อนของสแต็ก (Last In First Out) เมื่อลบองค์ประกอบออกจากสแต็กไวยากรณ์ที่ถูกต้องจะเป็นป๊อป เราไม่ลบองค์ประกอบออกจากสแต็กที่เรา "ป๊อป" ออก

โปรดจำไว้ว่า "A" เป็นองค์ประกอบแรกที่พุชไปยังสแต็กและ "C" เป็นรายการสุดท้ายที่พุชบนสแต็ก หากคุณตัดสินใจว่าคุณต้องการเห็นสิ่งที่อยู่ด้านล่างของสแต็กเนื่องจากองค์ประกอบทั้ง 3 อยู่ในสแต็กเรียงลำดับ A โดย B แรกเป็นตัวที่สองและ C เป็นองค์ประกอบที่สามส่วนบนสุดจะต้องโผล่ออกมาจากนั้น เพิ่มองค์ประกอบที่สองเพื่อดูด้านล่างของสแต็ก


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