1 / 57

پشته

جلسه چهارم. به نام خداوند هستی بخش یگانه. پشته. Stack. A.M. Safaei. جلسه چهارم. پشته. پشته ( Stack ) ساختمان داده ای که در آن عمل حذف و اضافه از یک طرف که عنصر بالا ( Top ) نامیده می شود، انجام می گیرد.

hide
Download Presentation

پشته

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. جلسه چهارم به نام خداوند هستی بخش یگانه پشته Stack A.M. Safaei

  2. جلسه چهارم پشته پشته (Stack) • ساختمان داده ای که در آن عمل حذف و اضافه از یک طرف که عنصر بالا (Top) نامیده می شود، انجام می گیرد. • به همین دلیل پشته را لیست آخرین ورودی ، اولین خروجی (LIFO = Last Input First Output) می نامند. • دو عمل اصلی که برروی پشته انجام می پذیرد: 1- Push : افزودن عنصری بالای پشته 2- POP : حذف کردن عنصری از بالای پشته • دو حالت خطای پشته : • سرریزی (Over flow) : موقعی اتفاق می افتد که می خواهیم عمل Push را در یک پشته پر انجام دهیم. • پاریزی (Under flow) : موقعی اتفاق می افتد که می خواهیم از یک پشته خالی عمل Pop را انجام دهیم.

  3. جلسه چهارم پشته پشته • عمل حذف و اضافه کردن عناصر درپشته از یک طرف پشته (بالای پشته)انجام میشود. • پشته مثل همه ساختمان داده های دیگر، محدودیت اندازه دارد و ممكن است پر یا خالی باشد. top B A C B A D C B A E D C B A D C B A top top top top top A حذف و جایگذاری عناصر در یک پشته

  4. جلسه چهارم پشته نوع داده انتزاعی پشته (ADT پشته) 1- مجموعه اقلام : مجموعه ای از عناصر که فقط از یک طرف موسوم به بالای پشته (Top) قابل دستیابی است. 2- عملیات : • Create : یک پشته خالی ایجاد کن • Empty: عملیات تست خالی بودن پشته را انجام می دهد. • Push : عمل افزودن عنصری به بالای پشته را انجام می دهد. • Pop : عمل حذف عنصری از بالای پشته را انجام می دهد. • Top: به عنصر بالای پشته اشاره می کند. • A=2, B=5 • Push (stack, A) • Push (stack, B+10) • Push (stack,3) • Push (stack,A-B) • While(Top !=0) • { • POP (stack, item) • Print (item) • } • Return • مثال : فرض کنید به یک (استک) پشته، 6 خانه اختصاص داده ایم در ابتدا پشته خالی است، خروجی برنامهروبه رو چیست؟ -3, 3,15,2

  5. جلسه چهارم پشته پیاده سازی عملگرهای پشته • برای پیاده سازی پشته از یک آرایه یک بعدی به طول MAXSTACK و یک متغیر اندیس به نام Top که همواره به بالاترین عنصر پشته اشاره کرده و مقدار اولیه آن برابر با :Top=-1 می باشد. • درج پشته • حذف از پشته Push(S,x) { if (top==MaxStack) error( ); else { top++; S[top]=X } } Pop(S) { if (top==-1) error( ); else return S[top--] } • مرتبه اجرائی O(1) • مرتبه اجرائی O(1)

  6. جلسه چهارم پشته پیاده سازی عمل بازیابی از پشته • عمل بازیابی عنصر بالای پشته را بازیابی می کند ولی آن را از پشته حذف نمی کند، اگر پشته خالی باشد امکان بازیابی عنصر وجود ندارد . • عمل بازیابی از پشته int stack:: top ( ) { if (empty (s)) { cout << "stack is empty" ; exit ( ); } else return item [my top] ; } • مرتبه اجرائی O(1)

  7. جلسه چهارم پشته پشته های چند گانه • اگر در برنامه ای بیش از دو پشته نیاز داشته باشیم می توان طبق الگوی زیر عمل کرد: • برای پیاده سازی n پشته در یک آرایه m تایی مانند s[m] ، آرایه مورد نظر را به n قسمت تقسیم می کنیم. مثال : فرض می کنیم یک الگوریتم به دو پشته A , B نیاز دارد جهت پیاده سازی می توان بجای تعریف دو آرایه جداگانه برای دو پشته A , B از یک آرایه بنام stack با اندازه کلی n=n1+n2 استفاده نمود و دو پشته را از دو طرف آرایه به سمت هم پر نمود. Stack A   Stack B

  8. جلسه چهارم پشته پشته های چند گانه • فرض می کنیم L[i] به پائین ترین نقطه و h[i] به بالاترین عنصر پشته اشاره می کند اگر L[i]=h[i] باشد در اینصورت پشته i ام خالی است و مقدار اولیه, h[i] L[i] بصورت زیر محاسبه می شود: Stack A   Stack B L [0] L [n] h [0]

  9. جلسه چهارم پشته مثال: • اگر در آرایه A[495] بخواهیم 4 پشته درست کنیم آدرس ابتدای هر پشته را بدست آورید؟ M=495 N=4 L[0]=-1 L[1]=(495/4) x 1= 123 L[2]=(495/4) x 2= 246 L[3]=(495/4) x 3= 369 • بنابراین پشته اول از أدرس 0 شروع و تا آدرس 122 طول دارد و پشته دوم از أدرس 123 شروع و تا آدرس 245 ادامه دارد و ...

  10. جلسه چهارم پشته کاربردهای پشته • کاربرد پشته در فراخوانی تابع • پشته ها اغلب برای بیان ترتیب مراحل پردازش ها بکار می رود که در آن مراحل ، یعنی پردازش باید تا برقراری و محقق شدن شرایط دیگر به تعویق بیافتد. مثال: فرض کنید A یک برنامه اصلی و B,C,D زیربرنامه هایی هستند که به ترتیب داده شده فراخوانی می شوند و کامل شدن برنامه A مستلزم کامل شدن برنامه B باشد و الی آخر.

  11. جلسه چهارم پشته کاربردهای پشته • کاربرد پشته در ارزیابی عبارات محاسباتی • عبارات میانوندی (infix) • عملگر میان دو عملوند قرار دارند : a + b • اولویت عملگر ها مهم می باشد • عبارات پسوندی (postfix) • عملگر بعد از عملوندش قرار دارد : ab+ • اولویت عملگر ها مهم نیست • عبارات پیشوندی (prefix) • عملگر پیش از عملوندش قرار دارد : +ab • اولویت عملگر ها مهم نیست • اولویت عملگر ها • 1- پرانتر ( ) • 2- توان ^ • 3- ضرب و تقسیم / , * • 4- جمع و تفریق - , + نكته 1: در عبارت های پیشوندی و پسوندی پرانتز وجود ندارد. نكته 2: ترتیب عملوندها در عبارت های میانوندی با ترتیب عملوندها در عبارت های پیشوندی و پسوندی یكسان است.

  12. جلسه چهارم پشته تبدیل عبارات میانوندی به پسوندی و پیشوندی روش پرانتزگذاری: 1- ابتدا با توجه به اولویت عملگرها عبارات را به طور کامل پارانتز گذاری می کنیم . 2- برای تبدیل به پیشوندی ، درون هر پرانتز عملگر را به سمت چپ منتقل می کنیم. 3- برای تبدیل به پسوندی ، درون هر پرانتز عملگر را به سمت راست منتقل می کنیم. 4- پرانتزها را حذف می کنیم. مثال:  پسوندی پیشوندی

  13. جلسه چهارم پشته • عبارت میانوندی زیر را به پسوندی و پیشوندی تبدیل نمایید: • a*b+c-d/c تمرین : • پسوندیab*c+de/- • پیشوندی-+*abc/de

  14. جلسه چهارم پشته تبدیل عبارات پسوندی به میانوندی • کلیه عملگرهایی که قبل ازآنها دو عملوند وجود دارد را پیدا نموده و به میانوندی تبدیل می کنیم و آنها را بعنوان یک عملوند در نظر گرفته و عملیات تکرار می کنیم. مثال : ab*c+de/-  a*bc+d/e-  a*b+c d/e-  a*b+c-d/e

  15. جلسه چهارم پشته تبدیل عبارات پیشوندی به میانودی • کلیه عملگرهایی که بعد ازآنها دو عملوند وجود دارد را پیدا نموده و به میانوندی تبدیل می کنیم و آنها را بعنوان یک عملوند در نظر گرفته و عملیات تکرار می کنیم. مثال: -+*abc/de -+a*bcd/e  -a*b+c d/e a*b+c-d/e

  16. جلسه چهارم پشته تبدیل عبارات پسوندی به پیشوندی • کلیه عملگرهایی که قبل ازآنها دو عملوند وجود دارد را پیدا نموده و عملگر را قبل از دو عملوند می گذاریم و سپس آنها را بعنوان یک عملوند در نظر میگیریم و بهمین ترتیب تا عبارت پیشوندی را بدست آید. مثال : ab *c+de/- *abc+/de-  +*abc/de-  -+*abc/de

  17. جلسه چهارم پشته تبدیل عبارات پیشوندی به پسوندی • کلیه عملگرهایی که بعد ازآنها دو عملوند وجود دارد را پیدا نموده و عملگر را به بعد از دو عملوند منتقل می دهیم و سپس آنها را بعنوان یک عملوند در نظر میگیریم و بهمین ترتیب تا عبارت پسوندی را بدست آید. • مثال -+*abc/de -+ab*c de/  - ab*c + de/  ab * c + de /-

  18. جلسه چهارم پشته • شکل پسوندی عبارت زیر چیست؟ • (a+b ^c^d)*(e+f/d) تمرین :

  19. جلسه چهارم پشته • عبارت را از چپ به راست پیمایش می کنیم • با مشاهده هر عملوند آن را در خروجی می نویسیم • با مشاهده هر پرانتز باز آن را در پشته Push می کنیم • با مشاهده هر عملگر ابتدا کلیه عملگرهای بالای پشته را که اولویتشان بیشتر یا مساوی آن عملگر است (در صورت وجود) Pop نموده چاپ می کنیم سپس عملگر مربوطه را push می کنیم. • با مشاهده هر پرانتز بسته آنقدر از پشته عملگر خارج نموده چاپ می کنیم تا به یک پرانتز باز برسیم در این صورت پرانتز باز را نیز خارج نموده و دور می ریزیم. • در نهایت کلیه عملگر های باقی مانده در پشته را نیز خارج نموده و چاپ می کنیم. • نکته : تعداد Push ها یا pop ها برابر است با تعداد عملگرها + تعداد پرانتزهای باز تبدیل عبارات میانوندی (infix) به پسوندی(Postfix) از طریق پشته

  20. تبدیل عبارات میانوندی به پسوندی از طریق پشته a b c / + ~ d e - ^ / - + ( ( ^ ~

  21. جلسه چهارم پشته • در تبدیل یک عبارت میانوندی به پسوندی اگر تعداد Symbol های push شده 9 باشد و تعداد pop شده ها از پشته که درعبارت پسوندی قرار گرفته اند 7 باشد چند جفت پرانتز در عبارت میانوندی و چند جفت در عبارت پسوندی وجود دارد؟ تمرین : • اولا در عبارت پسوندی پرانتز وجود ندارد. • ثانیا عملگرهایی که از پشته خارج می شوند چاپ می شوند ولی پرانتزهای باز دور ریخته می شوندو چون 9 pop داشته ایم و 7 تای آنها چاپ شده است بنابراین حتما 2 پرانتز داشته ایم. • نکته : تعداد Push ها یا pop ها برابر است با تعداد عملگرها + تعداد پرانتزهای باز

  22. جلسه چهارم پشته • عبارت را از راست به چپ پیمایش می کنیم • با مشاهده هر عملوند آن را در خروجی می نویسیم. • با مشاهده هر پرانتز بسته آن را در پشته Push می کنیم. • با مشاهده هر عملگر ابتدا کلیه عملگرهای بالای پشته را که اولویتشان بیشتر از آن عملگر است (در صورت وجود) Pop نموده چاپ می کنیم سپس عملگر مربوطه را push می کنیم. • با مشاهده هر پرانتز باز آنقدر از پشته عملگر خارج نموده چاپ می کنیم تا به یک پرانتز بسته برسیم در این صورت پرانتز بسته را نیز خارج نموده و دور می ریزیم. • در نهایت کلیه عملگر های باقی مانده در پشته را نیز خارج نموده و چاپ می کنیم. تبدیل عبارات میانوندی(infix) به پیشوندی(prefix) از طریق پشته

  23. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  24. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  25. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  26. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  27. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  28. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  29. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  30. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  31. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  32. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  33. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  34. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  35. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  36. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  37. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  38. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  39. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  40. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  41. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  42. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  43. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  44. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  45. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  46. جلسه چهارم پشته استفاده از پشته برای تبديل عبارت ميانوندی به پيشوندی

  47. جلسه چهارم پشته • عبارت را از چپ به راست پیمایش می کنیم • با مشاهده هر عملوند آن را در پشته push می کنیم . • با مشاهده هر عملگر دو عملوند از بالای پشته pop نموده، پس از انجام عملگر مربوطه بر روی آن دو عملوند (از پائین به بالای پشته) نتیجه را در پشته push می کنیم، این عمل را آنقدر ادامه می دهیم تا به پایان عبارت برسیم. در اینصورت حاصل کل عبارت در انتهای پشته قرار می گیرد. • نکته : تعداد push ها یا pop ها برابر است با تعداد عملوندها + تعداد عملگرهای ( تعداد عملگرها *2+ 1) تبدیل عبارات پسوندی (postfix) به میانوندی (infix) از طریق پشته

  48. جلسه چهارم پشته • عبارت را از راست به چپ پیمایش می کنیم • کلیه عملوندها را تا رسیدن به یک عملگر در پشته push می کنیم. • با مشاهده هر عملگر دو عملوند از بالای پشته pop نموده، عمل مربوطه را بر روی آن دو اعمال نموده (از بالا به پائین پشته) نتیجه را در پشته push می کنیم. • این عمل را آنقدر ادامه داده تا به انتهای عبارت برسیم. • در اینصورت حاصل کل عبارت در پشته باقی می ماند. • نکته : تعداد push ها یا pop ها برابر است با تعداد عملوندها + تعداد عملگرهای ]( تعداد عملگرها *2 )+ [ 1 تبدیل عبارات پیشوندی (prefix) به میانوندی (infix) از طریق پشته

  49. جلسه چهارم پشته • تمرین : • تبدیل عبارات پسوندی و پیشوندی به میانوندی از طریق پشته را با ذکر مثال نمایش دهید. • حداقل اندازه پشته برای تبدیل عبارت a*b-c+d^e^f به پسوندی چیست ؟ • (حل مسئله بر روی کاغذ ترسیم و خروجی مشخص شود)

  50. جلسه پنجم پشته طراحی و ساخت کلاس پشته • پیاده سازی کلاس پشته شامل دو مرحله است: • تعریف اعضای داده ای: ساختار حافظه را برای عناصر پشته تدارک می بیند و بصورت آرایه ای است که عناصر پشته در آن ذخیره می شود. • تعریف عملیاتی که در مرحله طراحی شناسایی می شود. • عملیات تعریف شده بر روی پشته عبارتند از : • Stack ( ) : پشته خالی را ایجاد می کند که سازنده کلاس می باشد. • Empty ( ) : خالی بودن پشته را بررسی می کند. • Push ( ) : عنصری را در بالای پشته اضافه می کند. • Pop ( ): عنصر بالای پشته را حذف می کند. • Top ( ) : عنصر بالای پشته را بازیابی می کند. • : Display ( ) محتویات پشته را نمایش می دهد.

More Related