|
|
|
|
|
الگوریتم هایی برای تبدیل عبارت های میانوندی ، پسوندی و پیشوندی به یکدیگر 1- تبدیل عبارت میانوندی به پسوندی الگوریتمی را که در زیر می بینید برای تبدیل یک عبارت میانوندی به یک عبارت پسوندی به کمک پشته و به زبان C++نوشته شده است . این برنامه به این صورت عمل می کند که ابتدا عبارت را پرانتز گذاری می کند و سپس از سمت چپ به راست شروع به پردازش رشته می کند و اپرندها(عملوند) را به خروجی می فرستد اما اپراتورها(عملگر) و پرانتز باز را وارد پشته می کند . اما اگر اپراتوری را وارد پشته نمود اما اپراتوری با اولویت بالاتر یا هم اولویت با آن در پشته قرار داشت ، ابتدا آن اپراتور را از پشته خارج می کند . اگر به پرانتز بسته رسیدیم تمام اپراتورهای تا اولین پرانتز باز را از پشته خارج می کند . در الگوریتم زیر isp اولویت در پشته و icp اولویت ورودی را نشان می دهند . # نیز نماینده سمت چپ ترین نشانه می باشد . e معرف رشته ای است که آن را پردازش می کنیم و x وy هم نشانه ها و یا لیترال ها می باشند. Void postfix (exp e) { Stack 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 توسط شرکت راهیان پرداز هرمز
|
|
||