فصل سوم : صف وپشته اهداف آشنايي با پشته آشنايي با صف ارزشيابي عبارات 1.

Slides:



Advertisements
Similar presentations
Queue theory.
Advertisements

مهدی آذرنوش مبحث ششم : آرایه ها و رشته ها حسابگری الگوریتمی.
دستور العمل نحوه محاسبه امتیاز مقالات ISI اعضای هیأت علمی دانشگاه صنعتی اصفهان بر اساس تعداد استنادات در پايگاه اسكاپوس شهریور ماه 1388 نفیسه دهقان.
1 آزمايشگاه سيستم های هوشمند ( Domain-specific Architecture.
روشهاي پارس بهينه. پارس توسط انسان تمام روشهاي پارس که تا کنون مطرح شدند از تکنيکهاي “جستجوي کامل” براي تفسير جمله استفاده مي کردند. به نظر ميرسد که پارس.
ارائه روشي براي شناسايي کاراکترهاي دستنويس، برپايه شبکه LVQ.
شنت گذاري  .
ارائه درس روباتيکز Extended Kalman Filter فريد ملازم استاد مربوطه دکتر شيري دانشگاه امير کبير – دانشکده کامپيوتر و فناوري اطلاعات.
روشهاي پارس بهينه ارائه دهنده : دکتر احمد عبدالله زاده تنظيم کننده : پرهام مرادي پائيز 85 دانشگاه صنعتي امير کبير دانشکده مهندسي کامپيوتر و فناوري اطلاعات.
نام و نام خانوادگي : فريد ملازم 1 آزمايشکاه سيستم هاي هوشمند ( موضوع ارائه Process and Deployment Design.
ارائه دهنده: دکتر احمد عبدالله زاده تنظيم کننده:پرهام مرادي
ارائه کننده: آلاء شريعتی
مديريت پروژه‌هاي فناوري اطلاعات فرآيند مديريت پروژه-مرحله برنامه‌ريزي تخصيص منابع.
مراحل مختلف اجرای يک برنامه
Solving problems by searching Chapter 3 Modified by Vali Derhami.
آرايه Array آرايه مجموعه اى از متغيرهاى از يك نوع است كه با يك نام مشترك تحت استفاده قرار مى گيرند. يك عنصر بخصوص در يك آرايه با يك index (انديس ) مورد.
اسامي شناسه ها (Identifier names) اسامي متغيرها ، توابع ، برچسب ها (labels) وبقيه اشياء تعريف شده توسط كاربر در C ، شناسه ( identifier ) ناميده مي شود.
1 فصل دوم تبديلات. 2 فصل دوم سرفصل مطالب مقدمه ضرب بردارها دستگاه ‌ هاي مختصات دوران ‌ ها مختصات همگن دوران ‌ ها و انتقال ‌ ها تبديلات تركيبي همگن تبديل.
شرط و تصميم اصول كامپيوتر 1. 2 الگوريتم اقليدس E1: [find remainder] Divide m by n and let r be the remainder. Clearly, 0
1/19 Informed search algorithms Chapter 4 Modified by Vali Derhami.
Department of Computer Eng. & IT Amirkabir University of Technology (Tehran Polytechnic) Data Structures Lecturer: Abbas Sarraf Order.
پشته Stack ساختمان داده ها و الگوريتمها. 2 آشنايي مجموعه پويا (Dynamic Set ): مجموعه اي است كه تركيب و تعداد عناصر آن ممكن است در طول زمان اجراي برنامه.
1 فصل سوم سينماتيك مستقيم. 2 محتواي فصل   تعريف مجموعه فازي   تابع عضويت   نمايش مجموعه هاي فازي   برش آلفا   متغيرهاي زباني   ساخت مجموعه.
Cost- Effectiveness Analysis
مدارهای منطقی فصل چهارم و پنجم - مدارهاي منطقي تركيبي ماجولي
فصل ششم روال ها.
ساختمان داده ها و الگوريتمها
ساختمان داده ها و الگوريتم ها
نظریه رفتار برنامه ريزي شده Theory of Planned Behavior
بنام خدا زبان برنامه نویسی C (21814( Lecture 12 Selected Topics
مرتب سازي مقايسه اي مرتب سازي خطي
آرايه ها و ساختارها.
آرايه ها.
ANOVA: Analysis Of Variance
ليست هاي پيوندي.
ANOVA: Analysis Of Variance
نمايش معادلات فضاي حالت توسط فرمهاي كانوليكال
روش حریصانه در طراحی الگوریتم
وحید حقيقت دوست دانشکده فنی و مهندسی دانشگاه شاهد
Quick Sort مرتب سازي سريع.
دستورات کنترل و تکرار- 2 اصول كامپيوتر 1.
لغت نامه و جدول درهم سازي Dictionaries and Hash Tables
آشنايي با برنامه نويسي به زبان C++
تکنیک دیماتل DEMATEL: decision making trial and evaluation laboratory.
معرفي درس ساختمان داده ها و الگوريتمها
دکتر حسين بلندي/ دکتر سید مجید اسماعیل زاده / دکتر بهمن قربانی واقعی
تبدیل فوریه (Fourier Transform)
نمايش اعداد در کامپيوتر چهار عمل اصلي
Similarity transformation
(Structured Query Language)
درخت جستجوی دودویی درخت جستجوي دودويي: درخت دودويي صفر نود يا بيشتر
سميرا قانوني زهرا معدني
گزگز و خواب رفتگي انگشتان دست
سيستمهاي اطلاعات مديريت
آموزش نرم افزار EndNote
هیدرولیک جریان در کانالهای باز
فيلتر كالمن معرفي : فيلتر كالمن تخمين بهينه حالت‌ها است كه براي سيستم‌هاي ديناميكي با اختلال تصادفي در سال 1960 بزاي سيستم‌هاي گسسته و در سال 1961 براي.
عباس طبیبی-دانشگاه صنعتی اصفهان
نظریه رفتار برنامه ريزي شده Theory of Planned Behavior
Test آزمون نرم افزار Mansooreh Jalalyazdi.
با تشکر از دکتر جواد سلیمی
اشياء و کلاس ها.
مثال : فلوچارتي رسم كنيد كه دو عدد از ورودي دريافت كرده بزرگترين عدد
در اين درس مباني ساختمان داده ها و الگوريتم ها تدریس میشود.
بسم الله الرحمن الرحيم.
تبديل همانندي در معادلات حالت و خروجي P ماتريس تبديل ثابت و ناويژه
گروه كارشناسي ارشد مديريت فنآوري اطلاعات(واحد الكترونيكي تهران)
مباني كامپيوتر و برنامه سازي Basics of Computer and Programming
مباني كامپيوتر و برنامه سازي Basics of Computer and Programming
تخمين پارامترها - ادامه
Presentation transcript:

فصل سوم : صف وپشته اهداف آشنايي با پشته آشنايي با صف ارزشيابي عبارات 1

فصل سوم : پشته و صف پشته و صف ، حالات خاصي از نوع داده عمومي يعني ليست هاي مرتب شده ، مي باشند. پشته پشته يک ليست مرتب شده اي است که جايگذاري و حذف از يک سمت آن که top (بالا) ناميده مي شود ، صورت مي گيرد. در پشته اي مانند ، عنصر پاييني و عنصر بالايي مي‌باشد. 2

پشته محدوديت کار با پشته ما را ملزم مي کند که اگر عناصر A،B،C،D،E را به ترتيب به پشته اضافه کنيم ، E اولين عنصري خواهد بود که که از پشته حذف مي گردد. از آنجا که آخرين عنصر وارده به پشته ، اولين عنصر حذف شده از آن مي‌باشد ، پشته را به عنوان يک ليست LIFO (آخرين ورودي ، اولین خروجي ) مي شناسيم. 3

پشته حذف و جايگذاري عناصر در يک پشته ← top ← top ←top ← top ← top A B A C B A D C B A E D C B A D C B A ← top ← top ←top ← top ← top ← top حذف و جايگذاري عناصر در يک پشته 4

پياده سازي پشته راحت ترين روش پياده سازي اين ADT ، استفاده از يک آرايه يک بعدي به نام items[MAX_STACK_SIZE] است که [MAX_STACK_SIZE] حداکثر تعداد عناصر آرايه مي‌باشد. اولين يا پايين ترين عنصر پشته در items[0] ذخيره، دومي در items[1] و i امين عنصر در items[i-1] ذخيره مي گردد. همراه با آرايه ، يک متغير به نام top وجود دارد که به عنصر بالايي پشته اشاره مي کند. در ابتدا به top مقدار 1- داده مي شود که نشان دهنده يک پشته خالي است. 5

پياده سازي پشته #define MAX_STACK_SIZE 100 template<class Type> class stack { public: stack(); void push(const Type&); Type* pop(Type&); int IsEmpty(); int IsFull(); private: int m_Top; Type items[MAX_STACK_SIZE]; }; پياده سازي پشته 6

پياده سازي پشته template<class Type> stack<Type>::stack() { m_Top = -1; } void stack<Type>::push(const Type& x) { items[ ++m_Top ] = x; } Type* stack<Type>::pop(Type& x) { if(IsEmpty()) return NULL; x = items[ m_Top-- ]; return &x; } int stack<Type>::IsEmpty() { return (m_Top == -1); } int stack<Type>::IsFull() { return (m_Top == MAX_STACK_SIZE -1) ; } پياده سازي پشته 7

صف (Queue) صف صف يک ليست است که تمامي جايگذاري آن از يک سمت و تمام حذف هاي ان از سمت ديگر انجام مي شود. درصف ، عنصر ابتدا (front) و عنصر انتها (rear) مي‌باشد و در کنار قرار دارد (0≤ i < n-1) 8

صف محدوديت صف اين است که ما A،B،C،D را به ترتيب اضافه مي کنيم در حالي که A اولين عنصري است که حذف مي شود. A B A C B A C B D C B ← rear ← rear ← rear ← rear ← rear ADD A ADD B ADD C DELETE ADD D درج و حذف عناصر از يک صف 9

صف چرخشي در اين روش پس از حذف يك عنصر، عناصر جابجا نميشوند بلكه تنها انديس نشان دهنده آغاز صف به جلو حركت ميكند. A B A C B A C B A D C B A ← rear ← rear ← rear ← rear ← rear ← front ← front ← front ← front ← front ADD A ADD B ADD C DELETE ADD D درج و حذف عناصر از يک صف چرخشي 10 10 10

صف از آنجا که اولين وارد شده به يک صف ، اولين عنصري است که خارج مي شود ، صف را به عنوان ليست هاي FIFO ( اولين ورودي، اولين خروجي ) در نظر مي گيرند. 11

پياده سازي صف چرخشي #define MAX_Queue_SIZE 100 template<class Type> class Queue { public: Queue(); void Add(const Type&); Type* Delete(Type&); int IsEmpty(); int IsFull(); private: int m_Front,m_Rear; Type items[MAX_Queue_SIZE]; }; پياده سازي صف چرخشي 12

پياده سازي صف چرخشي Queue<Type>::Queue () { m_Rear = 0; m_Front = 0; } void Queue<Type >::Add(const Type& x) { if( IsFull() ) return; items[m_Rear++] = x; m_Rear %= MAX_QUEUE _SIZE; } Type* Queue<Type >::Delete(Type& x) if(IsEmpty()) return NULL; x = items[m_Front++]; m_Front%= MAX_QUEUE _SIZE; return &x; int Queue<Type >::IsEmpty() { return (m_Front == m_Rear ); } int Queue<Type >::IsFull() { return ((m_Rear + 1) % MAX_QUEUE _SIZE == m_Front) ; } پياده سازي صف چرخشي 13

انواع مختلف صف و اصطلاحات Array-Based Queue “Normal” configuration “Wrap Around” configuration 14

انواع مختلف صف و اصطلاحات (ادامه...) Singly Linked List Queue اشيا به آغاز اضافه ميشوند 15

انواع مختلف صف و اصطلاحات (ادامه...) اشيا از انتها حذف ميشوند 16

انواع مختلف صف و اصطلاحات (ادامه...) Double-Ended Queues (deque) 17

insertFirst Insert an Object at the front of the deque. Input: Object Return: none insertLast Insert an Object at the rear of the deque. removeFirst Remove and return the Object from the front of deque Input: none Return: Object removeLast Remove and return the Object from the rear of deque first Return the first Object in the deque without removing the Object. last Return the last Object in the deque without removing the Object. isEmpty Return a boolean indicating if the deque is empty Input: none Return: boolean size Return the number of Objects in the deque. Input: none Return: int 18

مساله 2- تحليل عبارت رياضي بررسي دو كاربرد Stack مساله 1- مسير پر پيچ و خم مساله 2- تحليل عبارت رياضي

مساله مسير پر پيچ و خم (MAZING) بهترين راه نمايش مسير فوق يک آرايه دو بعدي است که صفرهاي آن نشان دهنده پيچ و خم هاي مسير مي‌باشد. 20

S G

تحليل مسير اندازه مسير پرپيچ و خم (maze) زمان اجراي مسير را تعيين مي‌کند . از آنجا که هر موقعيت درون مسير بيش از يک بار مشاهده نمي شود ، بدترين حالت پيچيدگي الگوريتم به صورت O(mp) مي‌باشد به نحوي که m و p تعداد سطرها و ستون هاي مسير است. 23

مسيرهاي ممكن براي انتخاب بعدي وقتي در موقعيت (i,j) باشيم

توجه داشته باشيم كه همه خانه ها داراي 8 خانه مجاور نيستند. براي عدم بروز اشكال و عدم بررس شرايط مرزي فرض ميكنيم مقادير مرزها برابر 1 است بدين ترتيب آرايه موردنظر بصورت maze[m+2][p+2] اعلان ميگردد. يک مسير پر پيچ و خم (maze) با ابعاد m×p به يک آرايه (m+2)×(p+2) نياز دارد. ورودي در موقعيت [1][1] و خروجي در موقعيت [m][p] مي‌باشد.

جهتهاي ممكن براي حركت بعدي را درون آرايه اي نگهداري ميكنيم struct offset { int a , b; }; Enum directions {N, NE, SE, S, SW, W, NW}; offset move[8];

1 2 3 4 5 6 7

ارزشيابي عبارات در هر زبان برنامه سازي براي ارزيابي صحيح عبارات ، به هر عملگر اولويتي نسبت مي دهيم. حال در هر جفت پرانتز ، اول عملگرهايي که داراي اولويت بالاتر هستند ، ارزشيابي مي شوند . 30

Token () [] -> . -- ++ ! ~ - + & * Sizeof (type) * / % + - << >> >>= <<= = = != & ^ l && ll ?: = += -= *= %= <<= >>= &= ^= l= ، اولويت عملگرها شکل مقابل نشان دهنده اولويت عملگرها در زبان c مي‌باشد. 31

روشهاي نمايش يك عبارت رياضي 2+3*5 روش ميان ترتيب (Infix) 2,+,3,*,5 روش پيش ترتيب (Prefix) +,2,*,3,5 روش پس ترتيب (Postfix) 2,3,5,*,+

روش infix روش استاندارد نوشتن عبارات به عنوان infix معرفي و شناخته مي شود چرا که در اين روش عملگرهاي دودويي را در بين دو عملوند قرار مي دهيم. 33

((a/(b-c+d))*(e-a)*c) نشانه گذاري postfix دراين روش هر عملگر بعد از عملوند هاي مربوطه ظاهر مي شود مثال Postfix Infix 2 3 4*+ ab*5+ 1 2+7* ab*c/ abc-d+/ea-*c* ab/c-de*+ac*- 2+3*4 a*b+5 (1+2)*7 a*b/c ((a/(b-c+d))*(e-a)*c) a/b-c+d*e-a*c 34

نحوه محاسبه يك عبارت Postfix عبارات براي ارزيابي از چپ به راست پويش مي شوند. عملوندها تا مشاهده يک عملگر، داخل پشته قرار مي گيرند، سپس تعداد لازم از عملوندها را از پشته خارج و پس از انجام عملکرد مربوطه ، نتيجه را دوباره به داخل پشته منتقل مي کنيم . اين کار را ادامه پيدا مي کند تا به انتهاي عبارت برسيم. 35

الگوريتم اول تبديل infix به postfix 1- پرانتزگذاري کامل عبارات 2- انتقال همه عملگرهاي دودويي به نحوي که با پرانتز بسته مربوطه سمت راست آن تعويض شوند 3- حذف تمام پرانتزها 36

الگوريتم دوم تبديل infix به postfix با استفاده از Stack ميتوان عبارت infix را به postfix تبديل نمود. 37

مثال تبديل عبارت a+b*c به نشانه گذاري postfix Output Top Stack [0] [1] [2] Token a ab abc abc*+ -1 1 + + * b * c eos 38

مثال تبديل a*(b+c)*d به نشانه گذاري postfix Output Top Stack [0] [1] [2] Token a ab abc abc+ abc+* abc+*d abc+*d* -1 1 2 * * ( * ( + ( b + c ) d eos 39

مراحل تبديل عبارت فرض كنيم يك كلاس Expression براي محاسبه عبارت تعريف كرده ايم. ورودي اين كلاس يك رشته ميباشد كه عبارت رياضي است براي ارزيابي عبارت بايد قدمهاي زير طي شود. قدم اول- تكه تكه كردن رشته ورودي (Tokenize) قدم دوم- تبديل از Infix به Postfix قدم سوم- تحليل عبارت Postfix

قدم اول- تكه تكه كردن رشته ورودي اين بخش يك عمليات پردازش رشته است روي رشته ورودي حركت ميكنيم تا به يك جدا كننده برسيم كه جدا كننده ها عبارتند از : فاصله، *،/،+،- وقتي يك بخش جدا شد درصورتي كه عدد باشد بايد معادل عددي آن و در غير اينصورت معادل عملگر آن نگهداري شود. class Token { union double num; char op; }; BOOL IsOperator;

قدم دوم- تبديل عبارت Infix‌ به Postfix خروجي قدم اول آرايه اي از Token ها ميباشد. در اين مرحله Token هاي مرتب شده بصورت Infix را بصورت Postfix تبديل ميكنيم براي تبديل از Stack استفاده ميشود.

اين عملگرها بايد در كلاس Token تعريف شوند void Expression::ToPostfix() { Stack<Token> st; Token x,y; st.Add(Token(‘#’,true)); //براي خالي نبودن پشته PostfixTokens = 0; for(int i=0 ; i<InfixTokens ; i++) x = infix[i]; if(x.IsOPerator== false) postfix[PostfixTokens++] = x; else if( x==‘)’ ) for( st.Pop(y) ; y != ‘(‘ ; st.Pop(y)) postfix[PostfixTokens++] = y; else { //x is an operator for(st.Pop(y) ; isp(y)<=icp(x) ; st.Pop(y)) st.Push(y); st.Push(x); } while(!st.IsEmpty()) postfix[PostfixTokens++] = *st.Pop(y) ; اين عملگرها بايد در كلاس Token تعريف شوند

جدول ISP‌ و ICP به شكل زير ميباشد ICP (In Comming Periority) ISP (In Stack Periority) Operator 1 Unary minus (-) 2 * / % 3 + - 4 ( )

قدم سوم- ارزيابي عبارت Postfix خروجي قدم دوم آرايه اي از Token ها ميباشد كه بصورت Postfix مرتب شده است. براي ارزيابي نيز از Stack استفاده ميشود. بدين ترتيب كه روي Token ها پيمايش انجام ميشود با مشاهده اپرند آنرا درون Stack قرا ميدهيم با مشاهده اپراتور با توجه به تعداد عملوندهاي آن از Stack عملوند حذف ميشو د و حاصل عمليات دوباره درون Stack قرار ميگيرد پس از اتمام ورودي ها آنچه در Stack باقي ميماند حاصل عبارت است.

void Expression::Evaluate() { Stack<Token> st; Token x,op1,op2; for(int i=0 ; i< PostfixTokens ; i++) x =postfix[i]; if(x.IsOPerator== false) st.Push( x ); else { //x is an operator st.Pop(op2) ; st.Pop(op1) ; //if operator needs two operand. st.Push(Calculate(x,op1,op2)); } st.Pop(ExperationValue);

اعضاي كلاس Expression class Expression { private: Token postfix[MaxTokens]; Token infix[MaxTokens]; int PostfixTokens; int InfixTokens; Token ExperationValue; public: void SetInput(string instr); int isp(Token); int icp(Token); void Tokenize(); void ToPostfix(); void Evaluate(); Token Calculate(Token operator, Token operand1 , Token operand2); }; اعضاي كلاس Expression

تحليل postfix فرض کنيد n تعداد نشانه ها در عبارت باشد ، براي خارج ساختن نشانه ها و انتقال آنها به خروجي نياز به Θ(n) مي‌باشد. بنابراين پيچيدگي تابع postfix به صورت Θ(n) خواهد بود. 48