كلاس پشته A stack class
اگرچه كلاس Box براي نشان دادن اجزائضروري يك كلاس مناسب بود، اما فاقد ارزش
عملي است . همانطوريكه از بحث برنامه نويسي شي ئ گرا (oop) بياد داريد ، يكي از
مزاياي بسيار مهم oop، كپسول سازي داده ها و كدي است كه با اين داده ها سر و كار
دارد . كلاس مكانيسمي است كه كپسول سازي در جاوا انجام مي گيرد. با خلق يك كلاس
شما نوع جديدي از داده را ايجاد مي كنيد كه هم طبيعت داده هاي مورد استفاده و
هم روالهاي ضروري براي كار با داده ها را تعريف مي كند . علاوه بر اين ، روشها
يك رابط پايدار و كنترل شده به داده هاي كلاس را تعريف مي كنند . بدين ترتيب
مي توانيد از طريق روشهاي يك كلاس از آن كلاس استفاده نماييد بدون اينكه نگران
جزئيات پياده سازي كلاس باشيد و يا اينكه نگران باشيد كه داده ها واقعا" چگونه
داخل آن كلاس مديريت مي شوند .
در يك مضمون ، يك كلاس شبيه يك " موتور داده "(data engine() است . براي كار
با موتور از طريق ابزارهاي كنترل كننده اش ، نيازي به دانش و اشراف كامل بر
چگونگي كاركرد داخلي موتور نداريد . در حقيقت ، از آنجاييكه جزئيات پنهان
شده اند ، مي توان كاركرد داخلي آن را بر حسب نياز تغيير داد . ماداميكه كد شما
كلاس را از طريق روشهايش استفاده مي كند ، مي توان جزئيات دروني را بدون ايجاد
اثرات جانبي در خارج كلاس تغيير داد .
پشته (stack) ، داده ها را بر حسب آنچه اول آمده آخر بيرون مي رود ذخيره
مي كند . بنابراين پشته شبيه يك پشته از بشقابهاي روي هم چيده است . اولين
بشقاب قرار گرفته روي ميز ، آخرين بشقابي است كه از آنجا خارج مي شود . پشته ها
بطور سنتي از طريق دو عمل نشاندن (push) و پراندن (pop) كنترل مي شوند . براي
نهادن يك قلم روي پشته ، از push استفاده مي كنيم . براي بيرون آوردن يك قلم
از پشته ، از pop استفاده مي كنيم . خواهيد ديد كه كپسول سازي كل مكانيسم پشته
بسيار ساده است .
در اينجا يك كلاس تحت نام stack وجود دارد كه يك پشته را براي اعداد صحيح
پياده سازي مي كند :
+ // This class defines an integer stack that can hold 10 values.
+ class Stack {
+ int stck[] = new int[10];
+ int tos;
+
+ // Initialize top-of-stack
+ Stack )({
+ tos =- 1;
+ }
+
+ // Pash an item onto the stack
+ void push(int item ){
+ if(tos==9)
+ System.out.println("Stack is full.");
+ else
+ stck[++tos] = item;
+ }
+
+ // Popan item from the stack
+ int pop )({
+ if(tos < 0 ){
+ System.out.println("Stack underflow.");
+ return 0;
+ }
+ else
+ return stck[tos--];
+ }
+ }
همانطوريكه مي بينيد ، كلاس stack دو قلم داده و سه روش را تعريف مي كند .
پشته اعداد صحيح توسط آرايه stck نگهداري مي شود . اين آرايه توسط متغير tos
نمايه سازي مي شود كه همواره نمايه بالاي پشته را نشان مي دهد . سازنده ()stack
متغير tos را با عدد 1- مقدار دهي اوليه مي كند ، كه نشان دهنده يك پشته خالي
است . روش ()push يك قلم را روي پشته مي نشاند . براي بازيابي يك قلم از پشته
روش ()pop را فراخواني مي كنيم . از آنجاييكه دسترسي به پشته توسط ()push و
()pop انجام مي گيرد ، اين حقيقت كه پشته توسط يك آرايه نگهداري مي شود واقعا"
با استفاده از پشته مرتبط نيست . بعنوان مثال پشته بايد در يك ساختار پيچيده تر
داده نگهداري شود ، نظير فهرست پيوندي (linked list) ، اما رابط تعريف شده
بوسيله ()push و ()pop همچنان دست نخورده باقي مي ماند .
كلاس Test stack كه در زير نشان داده ايم ، نشان دهنده كلاس stack است . اين
كلاس دو پشته عدد صحيح ايجاد كرده ، برخي مقادير را روي هر يك قرار داده و سپس
آن مقادير را مي پراند .
+ class TestStack {
+ public static void main(String args[] ){
+ Stack mystack1 = new Stack)(;
+ Stack mystack2 = new Stack)(;
+
+ // push some numbers onto the stack
+ for(int i=0; i<10; i++ )mystack1.push(i);
+ for(int i=10; i<20; i++ )mystack2.push(i);
+
+ // pop those numbers off the stack
+ System.out.println("Stack in mystack1:");
+ for(int i=0; i<10; i++)
+ System.out.println(mystack1.pop))(;
+
+ System.out.println("Stack in mystack2:");
+ for(int i=0; i<10; i++)
+ System.out.println(mystack2.pop))(;
+ }
+ }
اين برنامه خروجي زير را توليد مي كند :
Stack in mystack1:
9
8
7
6
5
4
3
2
1
0
Stack in mystack2:
19
18
17
16
15
14
13
12
11
10
همانطوريكه مي بينيد ، محتوي هر يك از پشته ها جداگانه است .
يك نكته ديگر درباره كلاس stack. همانطوريكه اخيرا" پياده سازي شده است ، براي
آرايه اي كه پشته را نگهداري مي كند يعني stck امكان دارد توسط كد خارج از كلاس stack
مورد تغيير قرار گيرد. اين حالت stack را براي سوئاستفاده يا استفاده هاي