Presentation is loading. Please wait.

Presentation is loading. Please wait.

Instructor: Mr.Vahidipour

Similar presentations


Presentation on theme: "Instructor: Mr.Vahidipour"— Presentation transcript:

1 Instructor: Mr.Vahidipour
پشته Stack Instructor: Mr.Vahidipour

2 تعريف حالت خاصي از نوع داده عمومي ليستهاي مرتب شده
LIFO ( Last in first out) ساختمان داده نيست بلكه نحوه استفاده از يك ساختمان داده است. يك آرايه نقش پشته را بازي مي كند اگر :جايگذاري و حذف از يك سمت (top) انجام شود.

3 ADT پشته class Stack { //Object: A finite ordered list with zero or more elements public: Stack(int MaxStackSize=DefauktSize); Boolean IsFull(); void Push (int &item); Boolean IsEmpty(); int* Pop(); }

4 مثال

5 طراحي كلاس Stack نوع متغيري كه در داخل استك نگهداري مي شود متفاوت است.
بهتر نيست که يک بار يک ليست را طراحی کنيم و چندين بار از آن استفاده کنيم؟ C++ اين امکان را به ما می دهد. برای اين که بتوانيم از يک استك برای چند بار استفاده کنيم بايد از کلاس های الگو(template) استفاده کنيم.

6 چگونگی کار با template دستور template <class KeyType> را قبل از هر کلاس وهر تابعی که در آن از template استفاده می شود قرار داده می شود. به جای KeyType می توان هر اسم ديگر که در شرايط اسم در C++ صدق می کند استفاده کرد با اين شرط که بعد از اسم گذاری فقط ازهمان اسم استفاده شود.

7 چگونگی کار با template- ادامه
template <class KeyType> retValType myClass< KeyType > :: Func(paramet list) { declaration and statements } template <class KeyType > void Stack< KeyType > :: Push(KeyType newElement) //declaration and statements

8 چگونگی کار با template- ادامه
هر جا لازم است متغيری از نوع الگو استفاده شود از قوانين تعريف و استفاده از متغير معمولی استفاده می کنیم. مثلا برای ارسال به تابع از روش زير استفاده می کنیم. retValType Function(KeyType value){}

9 چگونگی کار با template- ادامه
برای ساختن شيئی از يک کلاس از نوع متغيری که ميخواهيم از دستورالعمل زير استفاده می کنيم: myClass <valueType> myObject; مثال: Stack <int> intStack; که يک شی پشته با نوع اعداد صحيح ايجاد می کند. نکته : پس از تعيين نوع شی نمی توان از نوع ديگر به شی فرستاد خطای زمان کامپايل، اجرا و يا از دست دادن اطلاعات

10 ADT پشته با استفاده از template
template <class KeyType> class Stack { //Object: A finite ordered list with zero or more elements public: Stack(int MaxStackSize=DefauktSize); Boolean IsFull(); void Push (const KeyType &item); Boolean IsEmpty(); KeyType* Pop(); }

11 Boolean Stack<KeyType>:: IsFull()
Stack <KeyType>::Stack(int MaxStackSize):MaxSize(MaxStackSize) { Stack = new KeyType[MaxSize]; top = -1; } پياده سازي KeyType* Stack<KeyType>::Pop() {if (!IsEmpty()) return (Stack[top--];} template <class KeyType> class Stack { public: Stack(int MaxStackSize=DefauktSize); Boolean IsFull(); void Push (const KeyType &item); Boolean IsEmpty(); KeyType* Pop(); private: int top; KeyType *stack; int MaxSize; } void Stack<KeyType>::Push(const KeyType &x) {if (!IsFull()) Stack[++top]=x; } Boolean Stack<KeyType>:: IsFull() { If ( top==MaxSize -1 ) return 1 else return o;} Boolean Stack <KeyType>:: IsEmpty() { if (top ==-1) return 1 else return 0; }

12 سوالات اگر top=0 باشد شرط خالي و پر بودن پشته چيست؟ چه تغييراتي در ترتيب دستورات Push و Pop بايستي ايجاد شود؟ به سوال 2 از تمرينات بخش 3-2 پاسخ دهيد؟

13 Instructor : VahidiPour
صفQueue Instructor : VahidiPour

14 تعريف FIFO ( first in first out)
ساختمان داده نيست بلكه نحوه استفاده از يك ساختمان داده است. يك آرايه نقش صف را بازي مي كند اگر : عناصر از انتهاي آن (rear) اضافه شده و از قسمت ابتداي آن (front) از ليست خارج شوند.

15 A C صف B مثال: سه عنصر A,B,Cدر صف قرار دارند front rear AddQ (A)
AddQ (B) AddQ (C) DelQ (); front rear A C B

16 صف ADT template <class KeyType> class Queue
{ //Object: A finite ordered list with zero or more elements public: Queue(int MaxQueueSize=DefauktSize); Boolean IsFull(); void Add (const KeyType &item); Boolean IsEmpty(); KeyType* Delete(); }

17 Boolean Queue<KeyType>:: IsFull
Queue <KeyType>::Queu(int MaxQueueSize):MaxSize(MaxQueueSize) { queue = new KeyType[MaxSize]; front = rear = -1; } پياده سازي KeyType* Queue<KeyType>::Delete {if (!IsEmpty()) return (queue[++front];} class Queue { public: Queue (int MaxQueueSize=DefaultSize); Boolean IsFull(); Boolean IsEmpty(); void Add (const KeyType &item); KeyType* Delete(); private: int front, rear; KeyType *queue; int MaxSize; } void Queue<KeyType>::Add(const KeyType &x) {if (!IsFull()) queue[++rear]=x; } Boolean Queue<KeyType>:: IsFull { If ( rear==MaxSize -1 ) return 1 else return o;} Boolean Queue <KeyType>:: IsEmpty { if (front ==rear) return 1 else return 0; }

18 سوالات اگر rear=front=0 باشد شرط خالي و پر بودن صف چيست؟ چه تغييراتي در ترتيب دستورات Add و Delete بايستي ايجاد شود؟ تعداد عناصر موجود در صف؟ چگونه مي توان از صف در زمانبندي برنامه ها استفاده نمود ؟(مثال 3-2)

19 بهبود پياده سازي روشي براي جلوگيري از اتلاف حافظه. انواع:
1. شيفت دادن تمام عناصر 2. شيفت در صورت نياز 3.صف حلقوي

20 روش اول - شيفت دادن تمام عناصر
وقتي عنصر سر صف از ليست خارج شد تمامي عناصر يكي به طرف ابتداي صف شيفت داده مي شوند. فقط به يك اشاره گر((rear نياز داريم (front هميشه صفر است). فقط تابع Delete( ) تغيير مي كند A B C D front rear

21 روش اول - شيفت دادن تمام عناصر-ادامه
KeyType* Queue<KeyType>:: Delete() { : for ( i=0 ; i<rear ; i++) Queue[i] = Queue[i+1] rear - - ; }

22 روش دوم- شيفت در صورت نياز
ما زماني عناصر را شيفت مي دهيم كه صف پر شده باشد. فقط تابع addQ تغيير مي كند. 1 2 3 4 front rear rear A B C D F

23 روش دوم - شيفت در صورت نياز-ادامه
برنامه اي بنويسيد كه اين روش را پياده سازي نمايد.

24 صف حلقوي آرايه اي به صورت دايره است كه اولين عنصر آن(با انديس (0 بلافاصله بعد از آخرين عنصر آرايه قرار دارد. 1 2 . . . n-1 1 2 . n-1 .

25 صف حلقوي-ادامه عناصر در جهت عقربه هاي ساعت به آرايه اضافه مي شوند.
براي اضافه كردن اشاره گرهاي صف بايد از عملگر باقيمانده استفاده نمود شرط خالي و پر بودن صف چيست؟

26 صف حلقوي-ادامه front rear 1 2 3 4 5 front 1 2 3 4 5 rear C D 1 2 3 4 5
Add A B C Delete 1 2 3 4 5 front 1 2 3 4 5 rear C D 1 2 3 4 5 A B C rear front Boolean Queue <KeyType>:: IsEmpty { if (front ==rear) return 1 else return 0; } F

27 صف حلقوي-ادامه شرط خالي و پر بودن نمي تواند يكسان باشد. 1 D 5 2 C
front 1 2 3 4 5 rear C Add D E F G H D شرط خالي و پر بودن نمي تواند يكسان باشد. front 1 2 3 4 5 rear C D E F G Boolean Queue<KeyType>:: IsFull { If ( (rear +1) % MaxSize == front ) return 1 else return o;} F

28 سوالات توابع Add و Delete را از صف حلقوي بنويسيد؟(بخش 3-3)
اگر rear= 1 ,front=0 باشد شرط خالي و پر بودن صف حلقوي چيست؟ به سوال 3 از تمرينات بخش 3-3 پاسخ دهيد؟ برنامه نويسي: سوال 2 از بخش 3-4{ برنامه رانوشته و پرينت تحويل دهيد}

29 كاربردهاي صف 1. شبيه سازي 2. بافر صفحه كليد(با استفاده از صف حلقوي)
3. صف پيغام در Windows


Download ppt "Instructor: Mr.Vahidipour"

Similar presentations


Ads by Google