فاﺪﻫا - shahed.ac.ir€¦ · (prefix) ﺐﻴﺗﺮﺗ ﺶﻴﭘ ... postfix ﻪﺑ infix...

Post on 01-May-2020

28 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

صف وپشته:فصل سوم وم وپلاهداف

آشنايي با پشتهاهداف

آشنايي با صفعبارات ارزشيابي عباراتارزشيابي

1صفحه

سوم صف:فصل و پشته پشته و صف:فصل سوم

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

پشته يك ليست مرتب شده اي است كه جايگذاري و حذف از يكپشتهپشته

.ناميده مي شود ، صورت مي گيرد)باال(topسمت آن كه

عنصر پاييني و ، در پشته اي مانندميباشد بااليي .عنصر10 ,..., −= naaS0a1−na. عنصر بااليي مي باشد

2صفحه

پشتهپشته

محدوديت كار با پشته ما را ملزم مي كند كه اگر عناصر A،B،C،D،E، كنيم اضافه پشته به ترتيب به خواهدEرا عنصري اولين A،B،C،D،E، را به ترتيب به پشته اضافه كنيمE اولين عنصري خواهد

.بود كه كه از پشته حذف مي گردد

ناز آنجا كه آخرين عنصر وارده به پشته ، اولين عنصر حذف شده از آن ز ر ين و پ ب ر و ر رين ج زآخرين ورودي ، اولين ( LIFOمي باشد ، پشته را به عنوان يك ليست

.مي شناسيم)خروجي يم)روجي ي

3صفحه

پشتهپشته

← top

D

E

D D← top ←top

BC

← top ← top D

C

D

C

D

C

A

B

AB

A

← top B

A

B

A

B

AA A A A

حذف و جايگذاري عناصر در يك پشته

4صفحه

پشته سازي پياده سازي پشتهپياده، استفاده از يك آرايه يك بعدي به نام ADTراحت ترين روش پياده سازي اين

items[MAX STACK SIZE]كه ت MAX]ا STACK SIZE]داد ت حداكث items[MAX_STACK_SIZE]است كه[MAX_STACK_SIZE] حداكثر تعداد. عناصر آرايه مي باشد

امين عنصر در iو items[1]ذخيره، دومي درitems[0]اولين يا پايين ترين عنصر پشته در items[i-1]ذخيره مي گردد.

.وجود دارد كه به عنصر بااليي پشته اشاره مي كند topهمراه با آرايه ، يك متغير به نام ا ااtا ال ك ا ك ا . داده مي شود كه نشان دهنده يك پشته خالي است-1مقدارtopدر ابتدا به

5صفحه

#define MAX_STACK_SIZE 100

template<class Type>پياده سازي پشتهپياده سازي پشته

template class Type

class stack

{{

public:

stack();stack();

void push(const Type&);

Type* pop(Type&);Type pop(Type&);

int IsEmpty();

int IsFull();int IsFull();

private:

int m Top;int m_Top;

Type items[MAX_STACK_SIZE];

};

6صفحه

};

template<class Type>

stack<Type>::stack()پياده سازي پشتهپياده سازي پشته

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); }{ return (m_Top 1); }

int stack<Type>::IsFull()

{ return (m_Top == MAX_STACK_SIZE -1) ; }

7صفحه

(Queue)صف (Queue)صف

صفصفصف يك ليست است كه تمامي جايگذاري آن از يك سمت و تمام

.حذف هاي ان از سمت ديگر انجام مي شود و ي م ج ر ي ز ن ي

Qa و (front)، عنصر ابتدا درصفانتها و(rear)عنصر باشد كنارم دارددر قرار110 ,...,, −= naaaQ0a1−na

1+iaia قرار دارد در كنار مي باشد و(rear)عنصر انتها(0≤ i < n-1)

1+iia

8صفحه

صفصف

را به ترتيب اضافه مي كنيم در A،B،C،D محدوديت صف اين است كه ما ين ي رو يم ي يب ر ب ر.اولين عنصري است كه حذف مي شود Aحالي كه

Drear

← rear

C

B

C

B

D

C← rear

← rear ← rear

A

B

A

B

A← rearB

A

C

B

← rear

f t front f t front← front ← front ← front ← front ← front

درج و حذف عناصر از يك صف9صفحه

صفصف

كه است عنصري اولين ، صف يك به شده وارد اولين كه آنجا از آنجا كه اولين وارد شده به يك صف ، اولين عنصري است كهازاولين ( FIFOFIFOليست هاي ليست هاي خارج مي شود ، صف را به عنوان

خ ن ل ا ند)د گ نظ د .در نظر مي گيرند) ورودي، اولين خروجي

10صفحه

#define MAX_Queue_SIZE 100

template<class Type>پياده سازي سادهپياده سازي ساده

template class Type

class SimpleQueue

{{

public:

SimpleQueue ();SimpleQueue ();

void Add(const Type&);

Type* Delete(Type&);Type Delete(Type&);

int IsEmpty();

int IsFull();int IsFull();

private:

int m Rear;int m_Rear;

Type items[MAX_Queue_SIZE];

};

11صفحه

};

SimpleQueue <Type>:: SimpleQueue ()

{ m_Rear = ٠ ; } پياده سازي صف سادهپياده سازي صف سادهvoid SimpleQueue <Type >::Add(const Type& x)

{

if( IsFull() ) return;if( IsFull() ) return;

items[m_Rear++] = x;

}

T * Si l Q T D l t (T & )Type* SimpleQueue <Type >::Delete(Type& x)

{

if(IsEmpty()) return NULL;

x = items[0];

for(int i =1 ; i<m_Rear;i++)

items[i-1]=items[i];[ ] [ ];

m_Rear--;

return &x;

}}

int SimpleQueue <Type >::IsEmpty()

{ return (m_Rear==0 ); }

12صفحه

int SimpleQueue <Type >::IsFull()

{ return ((m_Rear + 1) == MAX_QUEUE _SIZE ) ; }

#define MAX_Queue_SIZE 100

template<class Type>پياده سازي صف چرخشيپياده سازي صف چرخشي

template class Type

class RecQueue

{{

public:

RecQueue();RecQueue();

void Add(const Type&);

Type* Delete(Type&);Type Delete(Type&);

int IsEmpty();

int IsFull();int IsFull();

private:

int m Front m Rear;int m_Front,m_Rear;

Type items[MAX_Queue_SIZE];

};

13صفحه

};

RecQueue<Type>::RecQueue ()

{ m_Rear = ٠ ; m_Front = 0; } پياده سازي صف چرخشي پياده سازي صف چرخشي void RecQueue<Type>::Add(const Type& x)

{

if( IsFull() ) return;if( IsFull() ) return;

items[m_Rear++] = x;

m_Rear %= MAX_QUEUE _SIZE ;

}}

Type* RecQueue<Type>::Delete(Type& x)

{

if(IsEmpty()) return NULL;

x = items[m_Front++];

m Front %= MAX QUEUE SIZE ;_ _Q _ ;

return &x;

}

i t R Q <T > I E t ()int RecQueue<Type>::IsEmpty()

{ return (m_Front == m_Rear ); }

int RecQueue<Type>::IsFull()

14صفحه

{ return ((m_Rear + 1) % MAX_QUEUE _SIZE == m_Front) ; }

اصطالحات و صف مختلف انواع مختلف صف و اصطالحاتانواعArray-Based Queue

“Normal” configuration

“Wrap Around” configurationp g

15صفحه

اصطالحات و صف مختلف )ادامه(انواع ...)ادامه(انواع مختلف صف و اصطالحات Singly Linked List Queue

Dequeue (Deleting Object from Front of Queue)

16صفحه

اصطالحات و صف مختلف )ادامه(انواع ...)ادامه(انواع مختلف صف و اصطالحات Enqueue(Inserting Object at Rear of Queue)

17صفحه

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

18صفحه

insertFirst Insert an Object at the front of the deque.

Input: Object Return: nonep j

insertLast Insert an Object at the rear of the deque.

Input: Object Return: none

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

Input: none Return: Object

first Return the first Object in the deque without removing the Object.

Input: none Return: Object

last Return the last Object in the deque without removing the Object.

Input: none Return: Object

isEmpty Return a boolean indicating if the deque is empty

Input: none Return: boolean

19صفحه

size Return the number of Objects in the deque.

Input: none Return: int

كاربرد دو Stackبررس Stackبررسي دو كاربرد

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

20صفحه

خم و پيچ پر مسير (MAZING)مساله (MAZING)مساله مسير پر پيچ و خم

بهترين راه نمايش مسير فوق يك آرايه دو بعدي است كه باشد م مسير هاي خم و پيچ دهنده نشان آن .صفرهاي آن نشان دهنده پيچ و خم هاي مسير مي باشدصفرهاي

21صفحه

S

G

22صفحه

23صفحه

يرتحليل مسير يل

. زمان اجراي مسير را تعيين مي كند (maze)اندازه مسير پرپيچ و خم ، شود نمي مشاهده بار يك از بيش مسير درون موقعيت هر كه آنجا از آنجا كه هر موقعيت درون مسير بيش از يك بار مشاهده نمي شود ،از

مي باشد به نحوي O(mp)بدترين حالت پيچيدگي الگوريتم به صورت استpوmكه مسير هاي ستون و سطرها .تعداد .تعداد سطرها و ستون هاي مسير استpوmكه

24صفحه

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

25صفحه

داراي ها خانه همه كه باشيم داشته نيستند8توجه مجاور خانه .خانه مجاور نيستند8توجه داشته باشيم كه همه خانه ها دارايبراي عدم بروز اشكال و عدم بررس شرايط مرزي فرض ميكنيم

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

(m+2)×(p+2)و خروجي [1][1]ورودي در موقعيت.نياز دارد ( ) (p ر( ز يي و ر ي ]ورو ][ روجي[ و.مي باشد [p][m]در موقعيت

26صفحه

جهتهاي ممكن براي حركت بعدي را درون آرايه اي نگهداري كن ميكنيمم

struct offset

{

int a , b;int a , b;

};

Enum directions {N, NE, SE, S, SW, W, NW};

ff [8]offset move[8];

27صفحه

00

1177

2266

3355

28صفحه

44

29صفحه

30صفحه

عبارات ارزشيابي عباراتارزشيابي

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

. داراي اولويت باالتر هستند ، ارزشيابي مي شوند و ي بي ي رز ر ب وي و ي ر

31صفحه

Tokenاولويت عملگرها() [] -> . ر وي و-- ++-- ++!~- +& * ا لگ ل ا ا ل قا * &شكلSizeof

(type)* / %

شكل مقابل نشان دهنده اولويت عملگرها.مي باشد cدر زبان

* / %+ -<< >>>>=>>=<<=

= = !=&^l&&ll?:= += -= *= %=<<= >>= &= ^= l=

32صفحه

<< >> & l

،

رياض عبارت يك نمايش 5*3+2روشهاي 2روشهاي نمايش يك عبارت رياضي 3 5

تيب ت ميان (Infix)وش (Infix)روش ميان ترتيب2,+,3,*,5

(Prefix)روش پيش ترتيب+,2,*,3,5, , ,3,5

(Postfix)روش پس ترتيب 2,3,5,*,+

33صفحه

infixروش روش

معرفي وinfixروش استاندارد نوشتن عبارات به عنوانشناخته مي شود چرا كه در اين روش عملگرهاي دودويي

.را در بين دو عملوند قرار مي دهيم

34صفحه

postfixنشانه گذاري

دراين روش هر عملگر بعد از عملوند هاي مربوطه ظاهر مي شودمثال

PostfixInfix

مثال

2 3 4*+ab*5+1 2+7*

2+3*4a*b+5

(1+2)*7 1 2+7ab*c/

abc-d+/ea-*c*ab/c de*+ac*

(1+2) 7a*b/c

((a/(b-c+d))*(e-a)*c)a/b c+d*e a*c ab/c-de*+ac*-a/b-c+d*e-a*c

عبارت يك محاسبه Postfixنحوه Postfixنحوه محاسبه يك عبارت

عملوندها تا . عبارات براي ارزيابي از چپ به راست پويش مي شوندا ال ا گ ا ق اخل لگ ك مشاهده يك عملگر، داخل پشته قرار مي گيرند، سپس تعداد الزم ازا

عملوندها را از پشته خارج و پس از انجام عملكرد مربوطه ، نتيجه را ك قل اخل كا ا ا ا ا كا ا اين كار را ادامه پيدا مي كند.دوباره به داخل پشته منتقل مي كنيم

.تا به انتهاي عبارت برسيم

36صفحه

تبديل اول postfixبه infixالگوريتم postfixبه infixالگوريتم اول تبديل

ت ا ع ك ل د ت اي ت الگ ان تpostfixهinfixت ه به صورت postfixبهinfixمي توان الگوريتمي براي تبديل يك عبارت:زير بيان نمود

پرانتزگذاري كامل عبارات -1

انتقال همه عملگرهاي دودويي به نحوي كه با پرانتز بسته مربوطه -2ند ش يض تع آن است ت سمت راست آن تعويض شوندس

انتزها3 پ ام ت حذف حذف تمام پرانتزها-3

37صفحه

تبديل دوم postfixبه infixالگوريتم postfixبه infixالگوريتم دوم تبديل

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

38صفحه

مثال

عبارت گذاريa+b*cتبديل نشانه postfixبه aتبديل عبارت b cبه نشانه گذاريpostfix

OutputTopStackToken

[0] [1] [2]

a-1a

a

ab

0

0

+

+

+

b

ab

abc

1

1

+ *

+ *

*

c

abc*+-1eos

مثالpostfixبه نشانه گذاري a*(b+c)*dتبديل

OutputTopStack

[0] [1] [2]

Token

a

a

-1

0*

a

*

a

ab

ab

1

1

2

* (

* (

* ( +

(

b

+

abc

abc+

abc+*

2

0

0

* ( +

*

*

c

)

* abc+

abc+*d

abc+*d*

0

0

0

*

*

d

eos

عبارت تبديل مراحل تبديل عبارتمراحل

.براي محاسبه عبارت تعريف كرده ايمExpressionفرض كنيم يك كالس س ي يم يمpرض ر ري ر ب ب ي برورودي اين كالس يك رشته ميباشد كه عبارت رياضي است

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

P tfi Postfixتحليل عبارت-قدم سوم

41صفحه

اول ورودي-قدم رشته كردن تكه تكه تكه تكه كردن رشته وروديقدم اولاين بخش يك عمليات پردازش رشته است

روي رشته ورودي حركت ميكنيم تا به يك جدا كننده برسيم كه جدا كننده ها عبارتند از-،+،/،*فاصله، :

وقتي يك بخش جدا شد درصورتي كه عدد باشد بايد معادل عددي آن و در غير اينصورت .معادل عملگر آن نگهداري شود

l T kclass Token

{

unionunion

{

double num;

char op;

};

BOOL I O t

42صفحه

BOOL IsOperator;

};

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

T kI fiP tfi Tokenهاي مرتب شده بصورتInfix را بصورتPostfixتبديل ميكنيم.استفاده ميشود Stackبراي تبديل از

43صفحه

void Expression::ToPostfix()

{

Stack<Token> st;

Token x,y;

st.Add(Token(‘#’,true)); //براي خالي نبودن پشته

PostfixTokens = 0;

Tگ kfor(int i=0 ; i<InfixTokens ; i++)

{

x = infix[i];

Tokenاين عملگرها بايد در كالستعريف شوند

if(x.IsOPerator== false)

postfix[PostfixTokens++] = x;

else if( x==‘)’ )

f ( t P ( ) ! ‘(‘ t P ( ))for( st.Pop(y) ; y != ‘(‘ ; st.Pop(y))

postfix[PostfixTokens++] = y;

else

{ //x is an operator{ //x is an operator

for(st.Pop(y) ; isp(y)<=icp(x) ; st.Pop(y))

postfix[PostfixTokens++] = y;

st.Push(y);st.Push(y);

st.Push(x);

}

}

44صفحه

}

while(!st.IsEmpty())

postfix[PostfixTokens++] = *st.Pop(y) ;

}

ميباشدICPوISPجدول زير شكل به به شكل زير ميباشدICPوISPجدول

ICP (In Comming Periority)ISP (In Stack Periority)Operator ( g y)( y)p

11Unary minus (-)

22* / %

33+ -

04(

40) 40)

45صفحه

سوم عبارت-قدم Postfixارزياب Postfixارزيابي عبارتقدم سوم

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

روي كه ترتيب ميشودTokenبدين انجام پيمايش ها ها پيمايش انجام ميشودTokenبدين ترتيب كه رويقرا ميدهيم Stackبا مشاهده اپرند آنرا درون

عملوند حذف ميشو د و Stackبا مشاهده اپراتور با توجه به تعداد عملوندهاي آن ازقرار ميگيرد Stackحاصل عمليات دوباره درون

.باقي ميماند حاصل عبارت است Stackپس از اتمام ورودي ها آنچه در

46صفحه

void Expression::Evaluate()

{

Stack<Token> st;

Token x,op1,op2;

for(int i=0 ; i< PostfixTokens ; i++)for(int i 0 ; i< PostfixTokens ; i++)

{

x =postfix[i];

if(x.IsOPerator== false)

st.Push( x );

lelse

{ //x is an operator

st.Pop(op2) ;st.Pop(op2) ;

st.Pop(op1) ; //if operator needs two operand.

st.Push(Calculate(x,op1,op2));

}

}

t P (E ti V l )

47صفحه

st.Pop(ExperationValue);

}

كالس Expressionاعضايclass Expression

{ :Expressionprivateاعضاي كالس

Token postfix[MaxTokens];

Token infix[MaxTokens];Token infix[MaxTokens];

int PostfixTokens;

int InfixTokens;

Token ExperationValue;

public:

id S I ( i i )void SetInput(string instr);

int isp(Token);

int icp(Token);int icp(Token);

void Tokenize();

void ToPostfix();

void Evaluate();

Token Calculate(Token operator, Token operand1 , Token operand2);

}

48صفحه

};

postfixتحليل postfixتحليل

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

postfixبه صورتΘ(n) خواهد بود. pور )ب بو( و

49صفحه

top related