java - كتاب - لماذا يجب علي استخدام Deque over Stack؟




تحميل كتاب data structures and algorithms in java (2)

لسبب واحد ، هو أكثر منطقية من حيث الميراث. حقيقة أن Stack يمتد Vector أمر غريب بالفعل ، من وجهة نظري. في وقت مبكر من جاوة ، كان الميراث المفرطة المنظمة البحرية الدولية - Properties مثالا آخر.

بالنسبة لي ، فإن الكلمة الحاسمة في المستندات التي اقتبستها متناسقة . يعرض Deque مجموعة من العمليات التي Deque حول القدرة على جلب / إضافة / إزالة العناصر من بداية أو نهاية المجموعة ، وتكرارها إلخ - وهذا كل شيء. ليس هناك عمدا أي طريقة للوصول إلى عنصر حسب الموضع ، والذي يكشف عنه Stack لأنه فئة فرعية من Vector .

أوه ، وكذلك Stack لا يوجد لديه واجهة ، لذلك إذا كنت تعرف أنك بحاجة إلى عمليات Stack ينتهي بك الأمر إلى الالتزام بفئة محددة من الخرسانة ، والتي عادة ما تكون فكرة جيدة.

أحتاج إلى بنية datast كبل لحالة الاستخدام الخاصة بي. يجب أن أكون قادراً على دفع العناصر إلى datastructure وأريد فقط استرداد العنصر الأخير من المكدس. يقول JavaDoc for Stack :

يتم توفير مجموعة أكثر تكاملاً وثباتًا من عمليات تكديس LIFO من خلال واجهة Deque وتطبيقاتها ، والتي يجب استخدامها في تفضيل هذه الفئة. فمثلا:

Deque<Integer> stack = new ArrayDeque<>();

أنا بالتأكيد لا أريد السلوك المتزامن هنا لأنني سوف أستخدم هذا datastructure المحلي إلى طريقة. بصرف النظر عن هذا السبب ، هل يجب أن أفضّل Deque over Stack هنا؟

ملاحظة: يقول javadoc من Deque:

كما يمكن استخدام Deques كمكوِّنات LIFO (Last-In-First-Out). يجب استخدام هذه الواجهة في التفضيل لفئة Stack القديمة.


هذا هو تفسيري للتناقض المذكور في وصف فئة المكدس.

إذا نظرت إلى تطبيقات عامة الغرض here - سترى أن هناك نهجًا متسقًا لتنفيذ المجموعة ، والخريطة والقائمة.

  • بالنسبة إلى المجموعة والخريطة ، لدينا تطبيقان قياسيان مع خرائط التجزئة والأشجار. أول واحد هو الأكثر استخداما والثاني يستخدم عندما نحتاج إلى هيكل مرتبة (كما أنه ينفذ واجهة خاصة به - SortedSet أو SortedMap).

  • قد نستخدم النمط المفضل للتصريح مثل Set<String> set = new HashSet<String>(); انظر الاسباب here .

ولكن الطبقة مكدس: 1) لا تملك واجهة خاصة بها ؛ 2) هو فئة فرعية من فئة المتجهات - والتي تقوم على صفيف يمكن تغيير حجمه ؛ لذلك حيث يتم تنفيذ قائمة مرتبطة من المكدس؟

في واجهة Deque ليس لدينا مثل هذه المشاكل بما في ذلك اثنين من التطبيقات (صف قابل لتغيير الحجم - ArrayDeque ، قائمة مرتبطة - LinkedList).







data-structures