ข้อมูลทุกชนิดเพิ่งต้มลงไปยังโหนดที่มีตัวชี้หรือไม่?


21

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

สแต็คและคิวเป็นข้อมูลนามธรรมสองประเภทที่สอนกันทั่วไปในหลักสูตร Intro CS ที่ไหนสักแห่งในชั้นเรียนนักเรียนมักจะต้องใช้สแต็คและคิวโดยใช้รายการที่เชื่อมโยงเป็นโครงสร้างข้อมูลพื้นฐานซึ่งหมายความว่าเรากลับไปที่แนวคิด "การรวบรวมโหนด" เดียวกัน

คิวลำดับความสำคัญสามารถสร้างขึ้นได้โดยใช้ Heap ฮีปสามารถถูกคิดเป็นต้นไม้ที่มีค่า min ที่รูท ต้นไม้ทุกประเภทรวมถึง BSTs, AVL, ฮีปสามารถถือเป็นชุดของโหนดที่เชื่อมต่อกันด้วยขอบ โหนดเหล่านี้เชื่อมโยงกันโดยที่หนึ่งโหนดชี้ไปที่อื่น

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


5
โครงสร้างข้อมูลพื้นฐานที่คุณกำลังเรียกว่า "เซลล์ข้อเสีย"; คุณสามารถสร้างโครงสร้างข้อมูลใด ๆ ที่คุณชอบจากพวกเขา หากคุณต้องการที่จะรู้ว่าทำไมผู้เขียนตำราเรียนที่ไม่ได้เลือกที่จะอธิบายเซลล์ข้อเสียถามผู้เขียนว่าทำไมพวกเขาเลือกที่จะทำ เพื่อไปจากคำอธิบายของการจัดเรียงของโหนดไปยังรหัสไบนารีที่เรียกว่า "รวบรวม" และเป็นงานของ "รวบรวม"
Eric Lippert

18
คุณสามารถโต้เถียงโครงสร้างข้อมูลทั้งหมดที่ต้มลงไปยังอาร์เรย์ ท้ายที่สุดแล้วพวกเขาทั้งหมดในหน่วยความจำซึ่งเป็นหนึ่งในอาร์เรย์ที่มีขนาดใหญ่มาก
BlueRaja - Danny Pflughoeft

10
คุณไม่สามารถใช้อาร์เรย์ใช้รายการที่เชื่อมโยงถ้าคุณต้องการที่จะให้การจัดทำดัชนี(1) O(1)
svick

5
ขออภัย แต่การพูดถึง "โหนดและตัวชี้" หมายความว่าคุณยอมแพ้กับการรับประทานอาหารที่มีคุณค่า " ตามที่โปรแกรมเมอร์จริงทุกคนรู้โครงสร้างข้อมูลที่มีประโยชน์เพียงอย่างเดียวคืออาเรย์สตริงรายการโครงสร้างชุด - นี่เป็นกรณีพิเศษของอาร์เรย์และสามารถรักษาได้ด้วยวิธีง่าย ๆ โดยไม่ทำให้ภาษาโปรแกรมของคุณยุ่งเหยิง ของภาวะแทรกซ้อน "การอ้างอิง:" โปรแกรมเมอร์จริงไม่ใช้ Pascal "จากweb.mit.edu/humor/Computers/real.programmers
alephzero

3
... แต่อย่างจริงจังสิ่งที่สำคัญเกี่ยวกับโครงสร้างข้อมูลคือสิ่งที่คุณสามารถทำได้กับมันไม่ใช่วิธีการนำไปใช้ ในศตวรรษที่ 21 การใช้พวกเขาด้วยตัวเองเป็นเพียงแบบฝึกหัดการเขียนโปรแกรมและสำหรับนักการศึกษาที่ขี้เกียจความจริงที่ว่าแบบฝึกหัดเหล่านี้ง่ายต่อการให้คะแนนมากกว่าความจริงที่ว่าพวกเขาไม่มีจุดหมายที่ดีที่สุด re-inventing wheel "เป็นกิจกรรมที่มีประโยชน์ในการเขียนโปรแกรมในโลกแห่งความเป็นจริง
alephzero

คำตอบ:


14

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

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

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

TL; DR: โดยพื้นฐานแล้วคอนเทนเนอร์และพอยน์เตอร์ทั้งหมดจะมี แต่การใช้งานที่เฉพาะเจาะจงและดีกว่าสำหรับบางอย่างและแย่ลงสำหรับผู้อื่น


1
Takeaway ของฉันคือข้อมูลส่วนใหญ่แน่นอนสามารถแสดงเป็นกลุ่มของโหนดกับตัวชี้ อย่างไรก็ตามไม่ใช่เพราะ (a) ในระดับกายภาพนั่นไม่ใช่สิ่งที่เกิดขึ้นและ (b) ในระดับแนวคิดการคิดค่าเป็นรายการที่เชื่อมโยงนั้นไม่มีประโยชน์สำหรับการให้เหตุผลเกี่ยวกับข้อมูลพื้นฐาน ทั้งหมดนี้เป็นเพียงนามธรรมเพื่อทำให้การคิดของเราง่ายขึ้นดังนั้นอาจเลือกสิ่งที่เป็นนามธรรมที่ดีที่สุดสำหรับสถานการณ์
derekchen14

13

ดูเหมือนว่าทุกแนวคิดของข้อมูลสามารถต้มลงไปยังโหนดที่มีพอยน์เตอร์ไปยังโหนดอื่นที่เหมาะสมเท่านั้น

โอ้ที่รักไม่ คุณกำลังทำร้ายฉัน

เช่นเดียวกับฉันพยายามอธิบายที่อื่น (" ความแตกต่างระหว่างแผนภูมิการค้นหาแบบไบนารีและไบนารีแบบกองคืออะไร ") แม้สำหรับโครงสร้างข้อมูลแบบคงที่มีหลายระดับเพื่อทำความเข้าใจ

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

และสำหรับกราฟเช่นซึ่งแน่นอนว่ามีลักษณะเหมือนปมและพอยน์เตอร์ (ขอบ) คุณมีสองการแสดงขั้นพื้นฐานอาร์เรย์ adjacency และรายการ adjacency ฉันไม่ได้ชี้ทั้งหมด

เมื่อพยายามเข้าใจโครงสร้างข้อมูลจริงๆคุณต้องศึกษาจุดดีและจุดอ่อนของตนเอง บางครั้งการแสดงใช้อาร์เรย์เพื่อประสิทธิภาพ (พื้นที่หรือเวลา) บางครั้งมีพอยน์เตอร์ (เพื่อความยืดหยุ่น) สิ่งนี้จะเก็บไว้แม้ในขณะที่คุณมีการใช้งาน "กระป๋อง" ที่ดีเช่น C ++ STL เพราะยังมีคุณสามารถเลือกการแสดงต้นแบบบางครั้ง มีการแลกเปลี่ยนที่นั่นอยู่เสมอ


10

:RR

ไม่มีใครคาดหวังว่าคุณจะพูดทั้งหมดนี้เพียงเพื่อกำหนดฟังก์ชั่นต่อเนื่องมิฉะนั้นจะไม่มีใครสามารถทำงานใด ๆ ได้เลย เราแค่ "เชื่อมั่น" ว่ามีคนสร้างงานที่น่าเบื่อสำหรับเรา

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

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


10

นี่คือตัวอย่างการนับ: ในλ-แคลคูลัสทุกประเภทข้อมูลจะลดลงไปยังฟังก์ชัน calcul-แคลคูลัสไม่มีโหนดหรือพอยน์เตอร์สิ่งเดียวที่มีคือฟังก์ชั่นดังนั้นทุกอย่างจะต้องดำเนินการโดยใช้ฟังก์ชั่น

นี่คือตัวอย่างของการเข้ารหัส booleans เป็นฟังก์ชันที่เขียนด้วย ECMAScript:

const T   = (thn, _  ) => thn,
      F   = (_  , els) => els,
      or  = (a  , b  ) => a(a, b),
      and = (a  , b  ) => a(b, a),
      not = a          => a(F, T),
      xor = (a  , b  ) => a(not(b), b),
      iff = (cnd, thn, els) => cnd(thn, els)();

และนี่คือรายการข้อเสีย:

const cons = (hd, tl) => which => which(hd, tl),
      first  = list => list(T),
      rest   = list => list(F);

จำนวนธรรมชาติสามารถนำมาใช้เป็นฟังก์ชั่นตัววนซ้ำ

ชุดเป็นสิ่งเดียวกับฟังก์ชั่นลักษณะ (เช่นcontainsวิธีการ)

โปรดทราบว่าการเข้ารหัสคริสตจักรของ Booleans ข้างต้นเป็นจริงว่ามีการใช้เงื่อนไขในภาษา OO เช่น Smalltalk ซึ่งไม่มีบูลีน, เงื่อนไขหรือลูปเป็นภาษาสร้างและใช้พวกเขาอย่างแท้จริงเป็นคุณลักษณะห้องสมุด ตัวอย่างใน Scala:

sealed abstract trait Boolean {
  def apply[T, U <: T, V <: T](thn: => U)(els: => V): T
  def(other: => Boolean): Boolean
  def(other: => Boolean): Boolean
  val ¬ : Boolean

  final val unary_! = ¬
  final def &(other: => Boolean) =(other)
  final def |(other: => Boolean) =(other)
}

case object True extends Boolean {
  override def apply[T, U <: T, V <: T](thn: => U)(els: => V): U = thn
  override def(other: => Boolean) = other
  override def(other: => Boolean): this.type = this
  override final val ¬ = False
}

case object False extends Boolean {
  override def apply[T, U <: T, V <: T](thn: => U)(els: => V): V = els
  override def(other: => Boolean): this.type = this
  override def(other: => Boolean) = other
  override final val ¬ = True
}

object BooleanExtension {
  import scala.language.implicitConversions
  implicit def boolean2Boolean(b: => scala.Boolean) = if (b) True else False
}

import BooleanExtension._

(2 < 3) { println("2 is less than 3") } { println("2 is greater than 3") }
// 2 is less than 3

2
@Hamsteriffic: ลองสิ่งนี้: จริง ๆ แล้ววิธีการปรับใช้เงื่อนไขในภาษา OO เช่น Smalltalk Smalltalk ไม่มีบูลีน, เงื่อนไขหรือลูปเป็นโครงสร้างภาษา สิ่งเหล่านี้ล้วน แต่ถูกนำไปใช้อย่างหมดจดในฐานะห้องสมุด ใจยังไม่ปลิว? William Cook ชี้ให้เห็นสิ่งที่ควรเห็นได้ชัดนานแล้ว แต่ไม่ได้สังเกตเห็นจริงๆ: เนื่องจาก OO เป็นเรื่องเกี่ยวกับพฤติกรรมนามธรรมและพฤติกรรมนามธรรมเป็นนามธรรมชนิดเดียวที่มีอยู่ใน calcul-แคลคูลัสจึงเป็นไปตามโปรแกรมทั้งหมดที่เขียนด้วย calcul-แคลคูลัสเป็นสิ่งจำเป็นโดย OO Ergo, calcul-แคลคูลัสเป็นคนแก่และ ...
Jörg W Mittag

…ภาษา OO ที่บริสุทธิ์ที่สุด!
Jörg W Mittag

1
วันที่เลวร้ายกับสมอลทอล์คก็เป็นวันที่ดีด้วย C ++ :-)
Bob Jarvis - Reinstate Monica

@ JörgWMittagฉันไม่คิดว่าข้อสรุปของคุณจะตามมาจากข้อสันนิษฐานของคุณฉันไม่คิดว่าการสันนิษฐานของคุณจะเป็นความจริงและฉันก็ไม่คิดว่าข้อสรุปของคุณจะเป็นจริง
เส้นทาง Miles Rout

4

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

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


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

2

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

แต่ทำไมหยุดอยู่ตรงนั้นล่ะ? การใช้งานโหนดและพอยน์เตอร์ทำให้เดือดเป็นบิต

การนำบิตมาใช้กับสัญญาณไฟฟ้า, การจัดเก็บแม่เหล็ก, สายไฟเบอร์ออปติก ฯลฯ (ในคำ, ฟิสิกส์)

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


Chris Date มีความแตกต่างอย่างมากระหว่างการนำไปใช้กับโมเดลแม้ว่าเรียงความของเขาจะมุ่งไปที่ฐานข้อมูลโดยเฉพาะ

เราสามารถไปนิด ๆ หน่อย ๆ ต่อไปถ้าเราตระหนักดีว่ามีไม่ได้เป็นคนเดียวเส้นแบ่งระหว่างรูปแบบและการดำเนินการ สิ่งนี้คล้ายกัน (หากไม่เหมือนกัน) กับแนวคิดของ "เลเยอร์ของสิ่งที่เป็นนามธรรม"

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

แต่ชั้นล่างของนามธรรมตัวเองมีรายละเอียดการปฏิบัติ

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

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

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

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


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


2

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

อาร์เรย์หรือเวกเตอร์สามารถนำไปใช้กับรายการที่เชื่อมโยงได้ แต่แทบจะไม่ควรเป็นเช่นนั้น

nnΘ(n)Θ(เข้าสู่ระบบn)Θ(1)(เช่นบล็อกลำดับของหน่วยความจำเข้าถึงโดยสุ่ม) นอกจากนี้บน CPU การเข้าถึงอาเรย์ที่เกิดขึ้นจริงนั้นง่ายกว่าในการนำมาใช้และดำเนินการได้เร็วกว่าและการจัดเก็บจะใช้หน่วยความจำน้อยลงเนื่องจากไม่ต้องเสียพื้นที่บนพอยน์เตอร์ระหว่างโหนดที่แยกกัน

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

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

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


1

ถ้ามันง่ายขนาดนี้ทำไมตำราเรียนไม่อธิบายว่าข้อมูลเป็นเพียงแค่จุดเชื่อมต่อที่มีตัวชี้?

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

abstractions ข้อมูลบางอย่างให้ยืมตัวเองได้ดีกับการใช้งาน "ที่เชื่อมโยง" มีวิธีที่ดีไม่มากในการใช้งานการแตกกิ่งของต้นไม้ทั่วไปโดยไม่ต้องใช้โหนดและพอยน์เตอร์ที่ชัดเจน (หรือบางลักษณะของโหนดและพอยน์เตอร์) แต่จากนั้นมี abstractions อื่น ๆ ที่คุณไม่เคยใช้กับโหนดและพอยน์เตอร์ ตัวเลขจุดลอยตัวอยู่ในใจ

สแต็คและคิวตกที่ใดที่หนึ่งระหว่าง มีบางครั้งที่มันเหมาะสมอย่างยิ่งที่จะทำการเชื่อมโยงการใช้งานของสแต็ก มีบางครั้งที่มันเหมาะสมกว่าที่จะใช้อาร์เรย์และ "ตัวชี้สแต็ก" เดี่ยว

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