لقد تعرضنا للعديد من هياكل البيانات من قبل ، بما في ذلك المصفوفات والقوائم المرتبطة وجداول التجزئة والأشجار الحمراء والأسود (أشجار الاستعلام الثنائية). اليوم ، دعونا نلقي نظرة على بنية بيانات أخرى: Stack.
ما هو المكدس؟ دعونا أولاً نلقي نظرة على مثال: المكدس يعادل برميل خشبي ضيق للغاية. عندما نضع الأشياء في البرميل الخشبي ونخرج الأشياء ، سنجد أن الشيء الذي وضعناه في القاع في البداية ، وكان أول ما أخرجناه هو الشخص الذي وضعناه للتو. لذلك ، فإن المكدس هو حاوية أولاً داخل وخارج (FirstInlastout ، أو في وقت لاحق وأول مرة). يحتوي على فم واحد فقط ، ويضع عناصر في هذا الفم ، وأيضًا يأخذ عناصر في هذا الفم. ثم دعونا نتعلم المكدس في JDK التالي.
1. المقدمة الأساسية واستخدام المتجه والمكدس
دعونا أولاً نلقي نظرة على تعريف JDK:
مكدس الفئة العامة <e> يمتد المتجه <e> {مما سبق ، يمكننا أن نرى أن المكدس موروث من المتجه ، لذلك يجب أن يكون لدينا أيضًا فهم معين للمتجه.
المتجه: صفائف ديناميكية آمنة لخيط الخيط
المكدس: المتجه الوراثي ، مكدس آمن مؤشر ترابط تم تنفيذه على أساس المصفوفات الديناميكية ؛
1. ميزات المتجه والمكدس:
المتجهات و arraylist هي نفسها في الأساس. الفرق هو أن المتجه آمن مؤشر ترابط وسيضيف الكلمة الرئيسية المتزامنة قبل طرق آمنة مؤشرات الترابط المحتملة ؛
المتجه: سرعة الوصول العشوائية السريعة ، ضعف الإدراج وأداء الإزالة (خصائص الصفيف) ؛ يدعم العناصر الفارغة ؛ لديه ترتيب يمكن تكرار العناصر ؛ آمن الخيط ؛
المكدس: ما بعد ، في البداية ، ينفذ بعض طرق عمليات المكدس الأساسية (في الواقع ، إنها ليست فقط بعد أن أولا ، لأن الموروثة من المتجه ، يمكن أن يكون هناك العديد من العمليات ، وبمعنى ما ، فهي ليست كومة) ؛
2. بنية المركز والمكدس:
فئة المتجهات
إنه في الأساس مثل ArrayList ، والاختلافات الرئيسية المتبقية هي كما يلي:
1. المتجه آمن
2. نمو قائمة Arraylist لا يتماشى مع نمو المتجهات
آخرون ، إذا كانت طرق البناء غير متناسقة ، يمكن للمتجه تهيئة السعة من خلال طريقة البناء ، وهناك طرق أخرى ، مثل طريقة الفهرس. يدعم المتجه البحث والبحث من الموقع المحدد ؛ بالإضافة إلى ذلك ، يحتوي المتجه أيضًا على بعض الطرق الزائدة مع وظائف مكررة ، مثل طريقة الإضافة و setelementat. السبب في ذلك هو لأسباب تاريخية. على سبيل المثال ، يتم ترك طريقة الإضافة من قبل. عندما تم تقديم إطار التجميع ، انضم Vector إلى عائلة المجموعة وتغييرها لتنفيذ واجهة القائمة. يجب تنفيذ بعض الطرق المحددة في واجهة القائمة. ومع ذلك ، لأسباب توافق ، لا يمكن حذف الأساليب القديمة ، لذلك ظهرت بعض الطرق القديمة مع التكرار. الآن تم استبداله بـ ArrayList ونادراً ما يتم استخدامه ، لذا فهم فقط.
فئة المكدس
يتم تحقيق العملية الأساسية للمكدس. الطريقة كما يلي:
المكدس العام () ؛
قم بإنشاء مكدس فارغ
المزامنة العامة e نظرة خاطفة () ؛
إرجاع القيمة في الجزء العلوي من المكدس ؛
Public E Push (e item) ؛
عملية المكدس
المزامنة العامة e pop () ؛
عملية خارج
منطقية عامة فارغة () ؛
تحديد ما إذا كانت المكدس فارغًا ؛
البحث العام المتزامن العام (كائن O) ؛
إرجاع موضع الكائن في المكدس ؛
بالنسبة إلى المكدس أعلاه ، سنستخدم الطريقة أعلاه بشكل متكرر بشكل أساسي فقط. على الرغم من أنه يرث المتجه ولديه العديد من الطرق ، إلا أنه لن يتم استخدامه بشكل أساسي ، إلا أنه يعامل فقط كمكدس.
3. الاستخدام الأساسي
يتم استخدام بعض الطرق في المتجه على النحو التالي. بالإضافة إلى ذلك ، فإن طريقة اجتياز المتجه هي نفس طريقة ArrayList. يمكنك استخدام foreach ، ايتراتور ، وللتحل العلوي.
استيراد java.util.arrays ؛ import java.util.iterator ؛ import java.util.list ؛ import java.util.listiterator ؛ import java.util.vector ؛ test public class {public static void main (string [] args) {vector <Mteger> vector = new Vector <integer> () ؛ لـ (int i = 0 ؛ i <10 ؛ i ++) {vector.add (i) ؛ } // print system.out.println (Vector.ToString ()) ؛ // size () system.out.println (vector.size ()) ؛ // يحتوي على system.out.println (Vector.Contains (2)) ؛ // iterator iterator <integer> iterator = vector.iterator () ؛ بينما (iterator.hasnext ()) {system.out.print (iterator.next () + "") ؛ } // toarray object [] objarr = vector.toarray () ؛ System.out.println ("/nobjarr:" + arrays.aslist (objarr)) ؛ integer [] intarr = vector.toarray (عدد صحيح جديد [vector.size ()]) ؛ System.out.println ("Intarr:" + arrays.aslist (Intarr)) ؛ // إضافة Vector.Add (5) ؛ // إزالة Vector.remove (5) ؛ System.out.println (متجه) ؛ // contaLsall System.out.println (Vector.Containsall (Arrays.aslist (5،6))) ؛ // addall Vector.addall (Arrays.aslist (555،666)) ؛ System.out.println (متجه) ؛ // removeall vector.removeall (arrays.aslist (555،666)) ؛ System.out.println (متجه) ؛ // addall method Vector.Addall (5 ، arrays.aslist (666،666 ، 6)) ؛ System.out.println (متجه) ؛ // get method system.out.println (vector.get (5)) ؛ // set method vector.set (5 ، 55) ؛ System.out.println (Vector.get (5)) ؛ // إضافة طريقة Vector.Add (0 ، 555) ؛ System.out.println (متجه) ؛ // إزالة طريقة Vector.remove (0) ؛ System.out.println (متجه) ؛ // indexof method system.out.println (vector.indexof (6)) ؛ // lastIndexof method system.out.println (vector.lastindexof (6)) ؛ // ListIrator Method ListIritiTerator <integer> listIratorator = Vector.ListIterator () ؛ System.out.println (listIratorator.hasprevious ()) ؛ // ListIratorator (index) method listIrator <integer> ilistiterator = Vector.ListIrator (5) ؛ System.out.println (ilistiterator.previous ()) ؛ // sublist method system.out.println (Vector.sublist (5 ، 7)) ؛ // clear Vector.clear () ؛ System.out.println (متجه) ؛ }}يتم استخدام بعض الطرق في المكدس على النحو التالي. نظرًا لأن المكدس يرث المتجه ، يمكن أن يستخدم المكدس أيضًا طرقًا يمكن أن يستخدمها المتجه. يسرد ما يلي بعض الأمثلة على الأساليب الفريدة من Stack. إنها بسيطة للغاية ، وهي بعض العمليات الأساسية للمكدس. بالإضافة إلى العديد من أساليب التجارة الخاصة بالمتجه ، يحتوي Stack أيضًا على أساليب اجتياز فريدة من نوعها (باستخدام الطريقة الفارغة وطريقة البوب لتحقيق اجتياز من أعلى إلى أسفل المكدس):
استيراد java.util.stack ؛ اختبار الفئة العامة {public static void main (string [] args) {stack <integer> stack = new stack <integer> () ؛ لـ (int i = 0 ؛ i <10 ؛ i ++) {stack.add (i) ؛ } system.out.println (stack) ؛ System.out.println (stack.peek ()) ؛ stack.push (555) ؛ system.out.println (stack) ؛ System.out.println (stack.pop ()) ؛ system.out.println (stack) ؛ System.out.println (stack.empty ()) ؛ System.out.println (Stack.Search (6)) ؛ System.out.println ("stack traversal:") ؛ بينما (! stack.empty ()) {system.out.print (stack.pop () + "") ؛ }}}القسم الفرعي:
المتجه آمن للخيط ، ولكن لديه ضعف الأداء. بشكل عام ، يتم استخدام ArrayList ما لم تكن هناك متطلبات خاصة ؛
إذا كنت تخطط لاستخدام المكدس كمكدس ، فيجب عليك متابعة العمليات العديدة للمكدس بصراحة وبصرامة. خلاف ذلك ، سيكون من المجدي استخدام المكدس ، وسيكون من الأفضل استخدام المتجه ؛
2. بنية Vector & Stacke وتخزينها الأساسي
يمتد ناقل الفئة العامة <e> على قائمة الأدوات المجردة <e>
المتجه هو فئة تنفيذ القائمة. في الواقع ، Vector هو أيضًا حاوية قائمة تعتمد على تطبيق الصفيف. وظائفها ورمز التنفيذ هي في الأساس نفس ArrayList. إذن ما هو مختلف؟ الأول هو أنه عند توسيع الصفيف ، يكون المتجه *2 و arraylist هو *1.5+1 ؛ والآخر هو أن المتجه آمن مؤشر الترابط ، في حين أن ArrayList ليس كذلك. تتمثل نهج المتجه الآمن في مؤشر الترابط في إضافة كلمة رئيسية متزامنة إلى كل طريقة لضمانها. ولكن هنا ، لم يعد المتجه رسميًا (معترف به من قبل الجميع) ولا ينصح به. إنه رسميًا لأن طريقة سلامة مؤشرات الترابط الخاصة بها هي قفل الطريقة بأكملها ، مما يؤدي إلى كفاءة منخفضة. فهل هناك حل أفضل؟ في الواقع ، لا يمكن القول أن هناك واحدة ، ولكن هناك حقًا ، مجموعة. SynchronizedList ()
نظرًا لأن المكدس موروثًا واستنادًا إلى المتجه ، فلنلقي نظرة على بعض التعريفات ورموز مصدر الأسلوب في المتجه:
// تستخدم الطبقة الأساسية مجموعة لتخزين كائن محمي البيانات [] ElementData ؛ // عدد العناصر المحمية int elementCount ؛ // تخصيص توسيع الحاوية وحجم الزيادة المحمي السعة int ؛ المتجه العام (int initialcapacity ، int courceincrement) {super () ؛ . // تهيئة الصفيف this.elementData = كائن جديد [initialCapacity] ؛ هذا. } // استخدم طريقة قفل الكلمات الرئيسية المتزامنة للتأكد من أن مؤشر ترابط واحد فقط يمكنه معالجة الطريقة في نفس الوقت المزامنة المنطقية المزامنة العامة (e e) {modcount ++ ؛ // توسيع التحقق من insureCapacityHelper (elementCount + 1) ؛ elementData [elementCount ++] = e ؛ العودة صحيح. } private void insureCapacityHelper (int mincapacity) {// العدد الحالي للعناصر int oldcapacity = elementData .Length ؛ // هل من الضروري توسيع السعة إذا (mincapacity> oldcapacity) {object [] olddata = elementData ؛ // إذا تم تخصيص توسيع الحاوية ، فتوسيع السعة وفقًا لـ Courceincrement ، وإلا قم بتوسيع السعة بمقدار مرتين (*2) int newCapacity = (CourceIncrement> 0)؟ (OldCapacity + cubleincrement): (OldCapacity * 2) ؛ if (newCapacity <mincapacity) {newCapacity = minCapacity ؛ } // Array copy elementData = arrays.copyof (elementData ، newCapacity) ؛ }}المتجه ببساطة انظر هذا. إذا لم يتم استدعاء طريقة المكدس الأخرى ، فلن يتم تحليلها. إذا كنت لا تفهم ، يمكنك التحقق من تحليل رمز مصدر ArrayList.
3. تحليل الطرق الرئيسية
1.peek () - احصل على الكائن في الجزء العلوي من المكدس
/ ** * احصل على الكائن في الجزء العلوي من المكدس ، ولكن لا تقم بحذف */ plex synchronized e peek () {// العدد الحالي لعناصر الحاوية int len = size () ؛ // إذا لم يكن هناك عنصر ، فقم بإلقاء استثناء مباشرةً إذا (len == 0) رمي فارغ STACKEXCESTION () ؛ // call elementat method لاسترداد العنصر الأخير من الصفيف (العنصر الأخير هو في الجزء العلوي من المكدس) إرجاع elementat (len - 1) ؛ } / *** الحصول على العنصر في هذا الموضع وفقًا لمؤشر الفهرس ، تكون هذه الطريقة في ناقل* / متزامن عام e elementat (int index) {// الخروج من الحدود إذا (index> = elementCount) {رمي ArrayIndExoutofBoundSexception (index + "> =" + elementCount) ؛ } // الحصول على العنصر إرجاع (e) elementData [index] ؛ }2.pop () - قم ببث المكدس (خارج المكدس) ، واحصل على الكائن في الجزء العلوي من المكدس ، وحذف الكائن من الحاوية
] // العدد الحالي لعناصر الحاوية int len = size () ؛ // احصل على الكائن في الجزء العلوي من المكدس OBJ من خلال طريقة PEEK () OBJ = PEEK () ؛ // استدعاء طريقة الإزالة لحذف الكائن في الجزء العلوي من remostelementat (Len - 1) ؛ // العودة إلى الكائن في الجزء العلوي من المكدس إرجاع OBJ ؛ } / *** حذف العنصر وفقًا لفهرس الفهرس* / الفراغ المزامن العام remostelementat (int index) {modcount ++ ؛ // حدود الخروج if (index> = elementCount) {رمي ArrayIndExOutOfBoundSexception (index + "> =" + elementCount) ؛ } else if (index <0) {refl new ArrayIndExOutOfBoundSexception (index) ؛ } // حساب عدد عناصر الصفيف المراد نقلها int j = elementCount - index - 1 ؛ إذا كان (j> 0) {// حرك الصفيف ، فقم بحذف واحدة في الوسط ، لذلك انقل العنصر اللاحق للأمام (التحرك هنا مباشرة في الكتابة فوق عنصر موضع الفهرس ، وهو ما يعادل الحذف). arraycopy (elementData ، index + 1 ، elementData ، index ، j) ؛ } // minus 1 elementCount-- ؛ // قم بتعيين العنصر الأخير من الحاوية إلى فارغة (لأنه تم حذف عنصر ، وتم نقل العناصر وراء الفهرس للأمام ، لذلك كان آخر عديمة الفائدة) elementData [elementCount] = null ؛ / * للسماح لـ GC بعمله */}3.push (e item) - ادفع (في المكدس) ، وأضف الكائن إلى الحاوية وأعوده
/ ** * أضف الكائن إلى الحاوية وإرجاع */ public e push (e item) {// call AddElement to AddElement (item) ؛ // إرجاع عنصر إرجاع العنصر ؛ } /*** أضف العنصر إلى الحاوية. هذه الطريقة في المتجه*/ Addelement void synchronized (E obj) {modcount ++ ؛ // توسيع التحقق من insureCapacityHelper (elementCount + 1) ؛ // ضع الكائن في الصفيف ، وعدد العناصر +1 elementData [elementCount ++] = obj ؛ }4.Search (كائن O) - إرجاع موضع الكائن في الحاوية ، الجزء العلوي من المكدس هو 1
/ ** * إرجاع موضع الكائن في الحاوية ، الجزء العلوي من المكدس هو 1 */ عام متزامن عام Search (كائن O) {// ابحث عن العنصر من الصفيف ، من آخر حدوث int i = lastIndexof (o) ؛ // لأن الجزء العلوي من عدد المكدس 1 ، تحتاج إلى استخدام Size () - i لحساب إذا (i> = 0) {size size () - i ؛ } العودة -1 ؛ }5. empty () - هل الحاوية فارغة
/ *** تحقق مما إذا كانت الحاوية فارغة*/ منطقية عامة فارغة () {size size () == 0 ؛ }القسم الفرعي:
في هذه المرحلة ، يتم تحليل طريقة المكدس. نظرًا لأن المكدس يعتمد في النهاية على المصفوفات ، فلا يزال من السهل فهمه (لأنه يعتمد على ArrayList).
على الرغم من أنه تم تحليل رمز المصدر للمكدس في JDK ، إلا أنه من الضروري مناقشته هنا. لا أعرف إذا وجدت أن هذا المكدس هنا غريب جدًا.
(1) لماذا يتم تنفيذ المكدس على أساس المصفوفات؟
نعلم جميعًا خصائص المصفوفات: فهي مريحة للاستعلام بناءً على الاشتراكات (الوصول العشوائي) ، ولكن الذاكرة ثابتة وكفاءة توسيع السعة منخفضة. من السهل التفكير في أنسب شيء في Stack لاستخدام القوائم المرتبطة.
(2) لماذا يرث المكدس المتجه؟
يعني الميراث أن المكدس يرث طريقة المتجه ، مما يجعل المكدس يشعر بأنه غير مناسب بعض الشيء ، على حد سواء قائمة ومكدس. ما الذي يجب أن يكون نهجًا معقولًا إذا كان عليك أن ترث المتجه: المكدس لا يرث المتجه ، ولكن ليس لديه سوى إشارة إلى المتجه نفسه ، هل التجميع صحيح؟
التفسير الوحيد هو أن المكدس تم إنشاؤه بواسطة JDK1.0. في ذلك الوقت ، لم يكن لدى الحاويات في JDK ناقلات فقط ، مثل ArrayList و LinkedList ، وما إلى ذلك ، وبما أن لديها بالفعل ناقلات ويمكنها تنفيذ وظائف المكدس ، ثم القيام بذلك. . . نظرًا لأنه مثالي لتنفيذ المكدس مع القوائم المرتبطة ، دعنا نجربها:
استيراد java.util.linkedList ؛ الطبقة العامة LinkedStack <e> {private LinkedList <E> مرتبطة ؛ Public LinkedStack () {this.linking = new LinkedList <e> () ؛ } public e push (e item) {this.linking .addfirst (item) ؛ عنصر الإرجاع ؛ } public e pop () {if (this.linked.isempty ()) {return null ؛ } إرجاع this.linked.RemoveFirst () ؛ } Public E PEEK () {if (this.linked.isempty ()) {return null ؛ } إرجاع this.linked.getFirst () ؛ } public int search (e item) {int i = th this.linked.indexof (item) ؛ إرجاع i + 1 ؛ } boolean public reghing () {return this.linked.isempty () ؛ }}يتم استخدام المكدس الذي تم تنفيذه بواسطة LinkedList هنا. تذكر كما هو مذكور في LinkedList ، تنفذ LinkedList الواجهة deque بحيث يمكن استخدامها كمكدس (الأول داخل وخارج) وقائمة انتظار (أولاً داخل وخارج).
4. الفرق بين المتجه و ArrayList
هناك ثلاث فئات تنفيذ في واجهة القائمة ، وهي ArrayList و Vector و LinkedList. تُستخدم القائمة لتخزين عناصر متعددة ، ويمكنها الحفاظ على ترتيب العناصر ، وتسمح بتكرار العناصر.
الاختلافات ذات الصلة بين فئات التنفيذ المحددة الثلاثة هي كما يلي:
1. ArrayList هي فئة تنفيذ القائمة الأكثر استخدامًا ، والتي يتم تنفيذها داخليًا من خلال المصفوفات ، والتي تتيح الوصول العشوائي السريع إلى العناصر. عيب المصفوفات هو أنه لا يمكن أن يكون هناك تباعد بين كل عنصر. عندما لا يكون حجم الصفيف غير راضٍ ، يجب زيادة سعة التخزين. من الضروري أن نقول أن بيانات المباراة التي تم نسخها بالفعل إلى مساحة التخزين الجديدة. عند إدخال العناصر أو حذفها من الوضع الأوسط من قائمة ArrayList ، يجب نسخ الصفيف ونقله وتكلفة مرتفعة نسبيًا. لذلك ، فهي مناسبة للبحث العشوائي والمرور ، وليس للإدراج والحذف.
2. يتم تنفيذ المستشار أيضًا من خلال المصفوفات ، والفرق هو أنه يدعم مزامنة مؤشرات الترابط ، أي في لحظة معينة ، يمكن لخيط واحد فقط أن يكتب متجهًا لتجنب عدم الاتساق بسبب كتابة خيوط متعددة في نفس الوقت ، ولكنه يكلف الكثير لتنفيذ المزامنة ، وبالتالي فإن الوصول إليه أبطأ من الوصول إلى ArrayList.
3. يستخدم LinkedList هيكل قائمة مرتبطة لتخزين البيانات ، وهو مناسب جدًا للإدراج الديناميكي وحذف البيانات ، وسرعات الوصول العشوائي بطيئة نسبيًا. بالإضافة إلى ذلك ، فإنه يوفر أيضًا طرقًا لم يتم تعريفها في واجهة القائمة ، والتي يتم استخدامها خصيصًا لتشغيل عناصر رأس الجدول وعناصر الذيل ، ويمكن استخدامها كودادة ، قوائم قوائم وقوائم ثنائية الاتجاه.
5. فهم موجز لقائمة الانتظار ، قائمة الانتظار المزدوجة.
1. قائمة الانتظار
تمت إضافة واجهة java.util.queue الجديدة إلى Java5 لدعم عمليات قائمة الانتظار المشتركة. هذه الواجهة تمتد واجهة java.util.collection.
قائمة انتظار الواجهة العامة <e> تمتد المجموعة <e>
بالإضافة إلى عمليات التجميع الأساسية ، توفر قوائم الانتظار عمليات الإدراج والاستخراج والتحقق الأخرى.
كل طريقة لها نموذجان: يرمي المرء استثناء (عند فشل العملية) ، والأخرى تُرجع قيمة خاصة (لاغية أو خاطئة ، اعتمادًا على العملية).
قوائم الانتظار عادة (ولكن ليس بالضرورة) فرز العناصر الفردية في FIFO (أولاً في البداية). ومع ذلك ، فإن قائمة انتظار الأولوية وقائمة انتظار الحياة (أو المكدس) هي استثناءات. السابق يفرز العناصر وفقًا للترتيب الطبيعي للمقارن أو العناصر المقدمة ، وفرز العناصر الأخيرة العناصر في LIFO (الأحدث في First Out).
في قائمة انتظار FIFO ، يتم إدخال جميع العناصر الجديدة في نهاية قائمة الانتظار ، ويتم إزالة عنصر الإزالة من رأس قائمة الانتظار.
عند استخدام قائمة الانتظار ، حاول تجنب أساليب ADD () وإزالة () التجميع ، ولكن استخدم العرض () لإضافة عناصر واستخدام الاستطلاع () للحصول على العناصر وإزالتها. مصلحتهم هي أنه يمكنهم تحديد ما إذا كان قد تم تحقيق النجاح من خلال إعادة القيمة ، وستعمل طرق ADD () وإزالة () على استثناءات عندما تفشل. إذا كنت ترغب في استخدام الواجهة الأمامية دون إزالة العنصر ، فاستخدم طريقة العنصر () أو PEEK ().
يمكن طريقة العرض إدراج عنصر ، وإلا فإنه يعيد خطأ. هذا يختلف عن طريقة collection.add ، والتي يمكن أن تفشل فقط في إضافة عناصر عن طريق إلقاء استثناء غير محدد.
طرق إزالة () و Poll () إزالة وإعادة رأس قائمة الانتظار. أي عنصر تمت إزالته من قائمة الانتظار هو وظيفة سياسة فرز قائمة الانتظار ، والتي تختلف في التطبيقات المختلفة. تتصرف طرق إزالة () و استطلاع () بشكل مختلف فقط عندما تكون قائمة الانتظار فارغة: طريقة إزالة () ترمي استثناء ، بينما تُرجع طريقة الاستطلاع () الفارغ.
العنصر () وإعادة نظرة خاطفة () ، لكن لا تزيل ، رأس قائمة الانتظار.
لا تسمح تطبيقات قائمة الانتظار عمومًا بإدخال عناصر خالية ، على الرغم من أن بعض التطبيقات (مثل LinkedList) لا تحظر إدخال خالية. حتى في التطبيقات التي تسمح NULL ، لا ينبغي إدراج NULL في قائمة الانتظار ، لأن NULL يتم استخدامها أيضًا كقيمة إرجاع خاصة لطريقة الاستطلاع ، مما يشير إلى أن قائمة الانتظار لا تحتوي على عناصر.
تجدر الإشارة إلى أن فئة LinkedList تنفذ واجهة قائمة الانتظار ، حتى نتمكن من استخدام LinkedList كطابور.
استيراد java.util.queue ؛ استيراد java.util.linkedList ؛ الفئة العامة testqueue {public static void main (string [] args) {Queue <string> Queue = new LinkedList <String> () ؛ Queue.Offer ("Hello") ؛ Queue.Offer ("World!") ؛ Queue.Offer ("Hello!") ؛ system.out.println (queue.size ()) ؛ سلسلة شارع بينما ((str = queue.poll ())! = null) {system.out.print (str) ؛ } system.out.println () ؛ system.out.println (queue.size ()) ؛ }}2. ديك
الواجهة العامة deque <e> يمتد قائمة الانتظار <e>
مجموعة خطية تدعم إدخال وإزالة العناصر في كلا الطرفين.
اسم Deque هو اختصار "قائمة الانتظار المزدوجة" وعادة ما تتم قراءتها باسم "سطح السفينة".
ليس لدى معظم تطبيقات Deque حد ثابت لعدد العناصر التي يمكن أن تحتوي عليها ، ولكن هذه الواجهة تدعم كل من قوائم الانتظار المحدودة للسعة وقوائم الانتظار المزدوجة دون حدود حجم ثابت.
تحدد هذه الواجهة طريقة للوصول إلى العناصر على طرفي قائمة انتظار مزدوجة. يوفر طرقًا لإدراج العناصر وإزالتها وفحصها. نظرًا لأن هذه الواجهة ترث قائمة انتظار واجهة قائمة الانتظار ، فهناك نوعان لكل من طرقها: يرمي المرء استثناء عند فشل العملية ، والآخر يعيد قيمة خاصة (لاغية أو خاطئة ، اعتمادًا على العملية).
أ. عند استخدام قائمة انتظار مزدوجة في قائمة انتظار ، ستحصل على سلوك FIFO (الأول ، الأول). أضف عنصرًا إلى نهاية قائمة الانتظار المزدوجة وإزالة العنصر من بداية قائمة الانتظار المزدوجة. الأساليب الموروثة من واجهة قائمة الانتظار مكافئة تمامًا للطريقة deque ، كما هو موضح في الجدول التالي:
ب. تستخدم كمكدس LIFO (الأخير في البداية). يجب استخدام هذه الواجهة أولاً بدلاً من فئات المكدس القديمة. عند استخدام قائمة انتظار مزدوجة كدقة ، يتم دفع العنصر في بداية قائمة الانتظار المزدوجة ويظهر من بداية قائمة الانتظار المزدوجة. طريقة المكدس تعادل تمامًا طريقة deque ، كما هو موضح في الجدول التالي: