فاﺪﻫا - shahed.ac.ir€¦ · (prefix) ﺐﻴﺗﺮﺗ ﺶﻴﭘ ... postfix ﻪﺑ infix...
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صفحه