อะไรคือความแตกต่างระหว่าง Array และ Stack?


10

ตามวิกิพีเดียสแต็ค :

เป็นชนิดข้อมูลนามธรรมเข้ามาก่อนออกก่อน (LIFO) และโครงสร้างข้อมูลเชิงเส้น

ในขณะที่อาร์เรย์ :

เป็นโครงสร้างข้อมูลที่ประกอบด้วยชุดขององค์ประกอบ (ค่าหรือตัวแปร) แต่ละรายการที่ระบุโดยดัชนีหรือคีย์อาร์เรย์อย่างน้อยหนึ่งรายการ

เท่าที่ฉันเข้าใจพวกเขาค่อนข้างคล้ายกัน ดังนั้นอะไรคือความแตกต่างที่สำคัญ? หากไม่เหมือนกันอาร์เรย์จะทำอะไรได้บ้างที่สแต็กไม่สามารถและกลับกันได้


5
คำถามของคุณไม่ได้รับคำตอบจากสิ่งที่คุณพบใน Wikipedia? คุณสามารถเข้าถึงองค์ประกอบของอาร์เรย์ในลำดับใดก็ได้ ต้องเข้าถึงสแต็กตามลำดับ LIFO
Caleb

8
@Caleb เพียงเพราะคุณอ่านบางสิ่งไม่ได้หมายความว่าคุณเข้าใจแนวคิด ในใจของฉันฉันไม่เข้าใจสิ่งนี้อย่างเต็มที่จนกว่าฉันจะถาม
ไดนามิก

3
-1 โดยทั่วไปคุณโพสต์คำตอบในคำถามของคุณเอง คุณถามอะไรอีก
Andres F.

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

2
ฉันเพิ่งอ่าน meta.programmers และเข้าใจว่าทำไมคุณถามคำถามที่ไม่ใช่คำถามนี้: มันสำหรับการแข่งขัน ฉันสงสัยอย่างจริงจังว่าคุณไม่เข้าใจบทความ Wikipedia อัปยศคุณ: /
Andres F.

คำตอบ:


45

แน่นอนว่าคุณสามารถใช้สแต็กกับอาร์เรย์ได้ ความแตกต่างคือในการเข้าถึง ในอาร์เรย์คุณมีรายการองค์ประกอบและคุณสามารถเข้าถึงองค์ประกอบใด ๆ ได้ตลอดเวลา (ลองนึกถึงกลุ่มของบล็อกไม้ที่วางเรียงกันเป็นแถว)

แต่ในสแต็กไม่มีการเข้าถึงแบบสุ่ม มีเพียงPush, PeekและPopทั้งหมดที่เกี่ยวข้องเฉพาะกับองค์ประกอบด้านบนของสแต็คที่ (คิดว่าบล็อกไม้ซ้อนกันในแนวตั้งในขณะนี้คุณไม่สามารถสัมผัสสิ่งใดด้านล่างด้านบนสุดของหอคอยมิฉะนั้นมันจะล้มลง)


11
บล็อกไม้ - การเปรียบเทียบที่ดี
Jesse Black

1
คุณพูดว่า "ในกองซ้อนไม่มีการเข้าถึงแบบสุ่ม" แต่ฉันไม่เห็นด้วยและจะเพิ่มรายละเอียดเพิ่มเติมในคำตอบของฉัน
Scott Whitlock

สแต็กถูกนำมาใช้อย่างแน่นอนด้วยการเข้าถึงแบบสุ่ม
old_timer

4
คุณต้องดูดที่ Jenga
DisgruntledGoat

1
@ ช่างก่อสร้างฉันรู้ มันเป็นเรื่องตลก.
DisgruntledGoat

6

ในกองบริสุทธิ์เพียงการดำเนินงานที่อนุญาตมีPush, PopและPeekแต่ในแง่การปฏิบัติที่ไม่เป็นความจริงว่า หรือค่อนข้างPeekบ่อยครั้งที่การดำเนินการช่วยให้คุณสามารถดูตำแหน่งใด ๆ บนสแต็กได้ แต่การจับก็คือมันเกี่ยวข้องกับปลายด้านหนึ่งของสแต็ก

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

ในกองคุณสามารถเพิ่ม / ลบที่ปลายทำงานของสแต็ค แต่คุณยังคงมีการเข้าถึงแบบสุ่มอ่านแต่มันอ้างอิงกับจุดสิ้นสุดการทำงาน นั่นคือความแตกต่างพื้นฐาน

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

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

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


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

4

ฉันคิดว่าความสับสนที่ใหญ่ที่สุดเกิดขึ้นที่นี่คือการนำไปใช้กับโครงสร้างข้อมูลพื้นฐาน

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

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

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

ดังนั้นคุณสามารถใช้อาร์เรย์เพื่อสร้างสแต็ก แต่ไม่เทียบเท่า


3

ความรับผิดชอบแตกต่างกัน:

  • สแต็คจะต้องสามารถปรากฏองค์ประกอบลงบนสแต็กและองค์ประกอบผลักดันจากสแต็กดังนั้นทำไมมันมักจะมีวิธีการPop()และPush()

  • ความรับผิดชอบของ Array คือการรับ / ตั้งค่าองค์ประกอบที่ดัชนีที่ระบุ


3

คุณสามารถดึงรายการจากดัชนีใด ๆ ของ A \ array

ด้วยสแต็กคุณสามารถดึงไอเท็มที่อยู่ตรงกลางสแต็ก A โดยใช้สแต็กอื่น: B

คุณนำไอเท็มอันดับหนึ่งออกจาก A และวางไว้ใน B จนกว่าคุณจะอยู่ที่ไอเท็มที่ต้องการของ A จากนั้นให้คุณนำไอเท็มจาก B กลับมาที่ด้านบนของสแต็ค A

ดังนั้นสำหรับข้อมูลที่ต้องการความสามารถในการดึงดัชนีโดยพลการสแต็กจะทำงานได้ยากขึ้น

ในสถานการณ์ที่คุณต้องการพฤติกรรม "เข้าก่อนออกก่อน" สแต็กจะทำให้คุณมีค่าใช้จ่ายน้อยกว่าอาร์เรย์


0

ฉันจะไม่บอกว่าพวกเขา "คล้ายกันมาก"

อาร์เรย์ใช้เพื่อเก็บสิ่งต่าง ๆ ที่จะสามารถเข้าถึงได้ตามลำดับหรือผ่านดัชนีในภายหลัง โครงสร้างข้อมูลไม่ได้บ่งบอกถึงวิธีการเข้าถึงใด ๆ (FIFO, LIFO, FILO, ฯลฯ ... ) แต่ก็สามารถใช้วิธีนั้นได้ถ้าคุณต้องการ

สแต็คเป็นวิธีการติดตามของสิ่งต่าง ๆ ตามที่สร้างขึ้น วิธีการเข้าถึงนั้นโดยนัย / จำเป็นขึ้นอยู่กับประเภทของสแต็กที่สร้างขึ้น กรอบสแต็กจะเป็นตัวอย่าง LIFO ข้อจำกัดความรับผิดชอบ - ฉันอาจผสมโครงสร้างอนุกรมวิธานข้อมูลของฉันที่นี่และสแต็กอาจอนุญาต LIFO อย่างแท้จริงเท่านั้น มันจะเป็นคิวประเภทอื่น

ดังนั้นฉันจึงสามารถใช้อาร์เรย์เป็นสแต็ก (แม้ว่าฉันจะไม่ต้องการ) แต่ฉันไม่สามารถใช้สแต็กเป็นอาร์เรย์ (ยกเว้นว่าฉันทำงานหนักมากกับมัน)


1
ในโดเมนของ 'โครงสร้างสำหรับเก็บสะสมวัตถุ' ฉันจะไม่พูดว่ามันคล้ายกันมาก ในขอบเขตของแนวคิดการเขียนโปรแกรมฉันจะบอกว่ามันค่อนข้างคล้ายกัน ในอาณาเขตของสิ่งต่าง ๆ โดยทั่วไปฉันจะบอกว่ามันเกือบจะเหมือนกัน
Kirk Broadhurst

0

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


0

อาเรย์นั้นมาจากมุมมองของโปรแกรมเมอร์ที่แก้ไขในสถานที่และขนาดคุณรู้ว่าคุณอยู่ที่ไหนและอยู่ที่ไหน คุณสามารถเข้าถึงได้ทั้งหมด

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

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

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