توسعه نرم افزار-طراحی وب-گرافیک رایانه ای-ساخت فیلم های تبلیغاتی

الگوریتم هایی برای تبدیل عبارت های میانوندی ، پسوندی و پیشوندی به یکدیگر

 

1- تبدیل عبارت میانوندی به پسوندی

الگوریتمی را که در زیر می بینید برای تبدیل یک عبارت میانوندی به یک عبارت پسوندی به کمک پشته و به زبان  C++نوشته شده است . این برنامه به این صورت عمل می کند که ابتدا عبارت را پرانتز گذاری می کند و سپس از سمت چپ به راست شروع به پردازش رشته می کند و اپرندها(عملوند) را به خروجی می فرستد اما اپراتورها(عملگر) و پرانتز باز را وارد پشته می کند . اما اگر اپراتوری را وارد پشته نمود اما اپراتوری با اولویت بالاتر یا هم اولویت با آن در پشته قرار داشت ، ابتدا آن اپراتور را از پشته خارج می کند . اگر به پرانتز بسته رسیدیم تمام اپراتورهای تا اولین پرانتز باز را از پشته خارج می کند .

در الگوریتم زیر isp اولویت در پشته و icp اولویت ورودی را نشان می دهند . # نیز نماینده سمت چپ ترین نشانه می باشد . e معرف رشته ای است که آن را پردازش می کنیم و x وy هم نشانه ها و یا لیترال ها می باشند.

Void postfix (exp e)

{

Stackstack;

Token y;

Stack.Add ("#");

For (token x=NextToken (e); x! ="#"; x=NextToken (e))

{

If(x is an operand)

Cout<

Else if (x= = ")")

For (y=*stack.Delete(y); y! ="("; y=*stack.Delete(y))     

Cout << y;     

//x is an operator

Else

{

For(y=*stack.Delete(y); ISP(y) <=icp(x); y=*stack.Delete(y))

Cout<

Stack.Add(y);

Stack.Add(x);

}

}

While (! stack.isEmpty ())

Cout<<*stack.Delete(y);

}

 

سایر الگوریتم ها نیز به همین ترتیب به دست می آیند .  

تبدیلات زیر را در نظر بگیرید :

Infix :(     (     (     (   A   *    B    )    /     C     )    -    D    )   +     E      )

Post:  (     (     (     (   A   B    *    )   C     /      )   D    -     )   E     +      )

Pre :  (     +    (      -   (    /      (    *   A    B     )   C    )     D   )     E      )

 

2- تبدیل عبارت پسوندی به پیشوندی:

الف) روش مستقیم :عبارت پسوندی را از چپ به راست به صورت (عملگر  -   عملوند   -   عملوند) پرانتز گذاری کرده و سپس عملگر را به قبل از پرانتز باز آن عبارت منتقل می کنیم .

ب) ابتدا آن را به فرم میانوندی تبدیل نموده و سپس از میانوندی به پیشوندی می بریم . برای نوشتن الگوریتم ، این روش ساده تر است .

 

3- تبدیل عبارت پیشوندی به پسوندی:

الف ) روش مستقیم : عبارت پسوندی را از راست به چپ به صورت (عملوند -  عملوند  -   عملگر  ) پرانتز گذاری کرده و سپس عملگر را به بعد از پرانتز بسته آن عبارت منتقل می کنیم .

ب) ابتدا آن را به فرم میانوندی برده و سپس از میانوندی به پسوندی تبدیل می کنیم . برای نوشتن الگوریتم ، این روش ساده تر است .

 

4- تبدیل عبارت پسوندی به میانوندی

از یک پشته استفاده می کنیم . از چپ به راست عبارت را ارزیابی نموده و عملگرها را در پشته قرار می دهیم و اگر به عملوندی رسیدیم آن را بر دو عبارت بالای پشته اعمال کرده و نتیجه را در پشته قرار می دهیم . ( دقت کنید که پایینی بر بالایی اعمال می شود . )

 

 

5- تبدیل عبارت پیشوندی به میانوندی

از یک پشته استفاده می کنیم . از راست به چپ عبارت را ارزیابی نموده و عملگرها را در پشته قرار می دهیم و اگر به عملوندی رسیدیم آن را بر دو عبارت بالای پشته اعمال کرده و نتیجه را در پشته قرار می دهیم . ( دقت کنید که عملوند بالایی بر عملوند پایینی اعمال می شود . )

 

6- تبدیل عبارت میانوندی به پیشوندی

عبارت را کاملا پرانتز گذاری کرده و سپس از چپ به راست هر عملگر را به فبل از پرانتز بسته شامل دو عملوندش منتقل می کنیم .

 

دقت کنید که نوشتن الگوریتم ها به سادگی امکان پذیر است . کافی است که شما مراحل بالا را بر روی یک پشته اعمال نمایید تا متوجه شوید

 

+ نوشته شده در  سه شنبه ششم آذر 1386ساعت 6:39  توسط شرکت راهیان پرداز هرمز  |