PDA

View Full Version : الگوریتم تبدیل عبارت میانوند به پیشوند



behnam_dr
یک شنبه 20 آبان 1386, 11:30 صبح
سلام .از مدیر انجمن خواهشمندم تذکر برای تکراری عنوان کردن این مساله نفرمائید .چون هیچ کس پاسخی درست در این باره نداده لطفا یه الگوریتم صحیح رو یه نفر توضیح بده .

متشکرم

whitehat
یک شنبه 20 آبان 1386, 14:10 عصر
من الگوریتم برای نوشتن برنامه آنرا توضیح می دهم (قبلا برنامه آن در این بخش گذاشته شده)
برای نوشتن آن شما نیاز به یک پشته (پشته A) و یک تابع عملگر دارید که آنرا بعدا توضیح می دهم، لازم به تذکر است که برای این الگوریتم چند راه حل وجود داره که ساده ترین راه حل آنرا می نویسم که از یک پشته اضافی (پشته B) استفاده می کند
--------------------------------

1- جمله میانوندی را از ورودی بخوانید
2- از انتهای رشته شروع به پیمایش کنید
3- یک کاراکتر بخوان
4- اگر به عملوند رسیدیم آنرا در پشته B اضافه (Push) می کنیم
5- والا اگر به یک عملگر رسیدیم :
1-5- اگر پشته A خالی بود عملگر را به پشته A اضافه می کنیم
2-5-اگر اولویت عملگر فعلی از اولویت عملگر بالای پشته A بیشتر بود آنرا به پشته A اضافه می کنیم
3-5-اگر اولویت عملگر فعلی از اولویت عملگر بالای پشته A کمتر بود از پشته A آنقدر Pop می کنیم تا به عملگری برسیم که اولویت آن از عملگر فعلی بیشتر باشد
6-آیا پیمایش جمله ورودی پایان یافته
1-6-خیر، اشاره گر کاراکتر را یکی کم کن و به مرحله 3 برو
2-6- بلی به مرحله بعد برو
7- اگر پشته A خالی نیست تمام عناصر آنرا Pop و به پشته B اضافه کن
8- پشته B را خالی کن و هر کاراکتر Pop شده را در خروجی درج کن
---------------------------------
تابع عملگر
-پرانتز بسته تحت هر شرایطی در پشته درج می شود یعنی اولویت آن از همه عملگر ها بیشتر است
-پرانتز باز همیشه تمام عناصر پشته را Pop می کند تا به یک پرانتز بسته برسد و بعد از آنکه پرانتز بسته pop شد به سراغ کاراکتر بعدی می رویم
-اولویت ضرب و تقسیم از جمع و منها بیشتر است
-اولویت دو عملگر یکسان مانند -+،++،--،-+،*/،//،**،*/ کمتر است یعنی مثلا + روی - یا + قرار نمی گیرد
اگر تابع عملگر را بصورت( Eval(OP1,OP2 فرض کنیم که OP1 عنصر ورودی و OP2 عنصر بالای پشته باشد آنرا می توانید به صورت زیر بنویسید


Eval(OP1,OP2)=True If OP1<OP2
Eval(OP1,OP2)=False If OP1>OP2
Eval(OP1,OP2)=False If OP1=Op2
Eval(')',OP)=False
Eval(OP,'(')=True
Eval(OP,')')=False

تابع Eval در صورتی که True بود عملیات Pop انجام می شود تا زمانیکه False شود یا رشته تمام شود و در صورتی که False باشد عمل push انجام می شود
دقت کنید که ) یا ( در پشته B درج نمی شود
این الگوریتم راه حل بازگشتی ساده دیگری نیز دارد و همینطور شما می توانید به جای استفاده از پشته دوم رشته را از انتها در زمان پردازش چاپ کنید
لطفا روش را بررسی کنید و اگر سوالی داشتید بپرسید (امیدوارم جایی اشتباه نکرده باشم :) )
موفق باشید

عاطفهجون
سه شنبه 12 آبان 1388, 09:08 صبح
سلام با تشکر از شما که الگوریتم میانوندی به پیشوندی در اختیار ما گذاشتید اگر براتون امکان دارد توضیح همراه با برنامه باشد

konjdivar
یک شنبه 17 آبان 1388, 08:59 صبح
الگوریتمی برای تبدیل یک عبارت میانوندی به یک عبارت پیشوندی یا لهستانی میخواستم که مثلا با دریافت
a+b
عبارت ab+ را ایجاد کند و یا با دریافت


(a+b)*(c-(d/f)*h)

عبارت


ab-c*/dfh+*
را تولید کند[/quote]

hatame mazaheri
یک شنبه 17 آبان 1388, 16:36 عصر
می شه بر نا مه ان را دباره روی سیت بگذارید متشکر

aapalireza
پنج شنبه 04 آذر 1389, 12:54 عصر
من الگوریتم برای نوشتن برنامه آنرا توضیح می دهم (قبلا برنامه آن در این بخش گذاشته شده)
برای نوشتن آن شما نیاز به یک پشته (پشته A) و یک تابع عملگر دارید که آنرا بعدا توضیح می دهم، لازم به تذکر است که برای این الگوریتم چند راه حل وجود داره که ساده ترین راه حل آنرا می نویسم که از یک پشته اضافی (پشته B) استفاده می کند
--------------------------------

1- جمله میانوندی را از ورودی بخوانید
2- از انتهای رشته شروع به پیمایش کنید
3- یک کاراکتر بخوان
4- اگر به عملوند رسیدیم آنرا در پشته B اضافه (Push) می کنیم
5- والا اگر به یک عملگر رسیدیم :
1-5- اگر پشته A خالی بود عملگر را به پشته A اضافه می کنیم
2-5-اگر اولویت عملگر فعلی از اولویت عملگر بالای پشته A بیشتر بود آنرا به پشته A اضافه می کنیم
3-5-اگر اولویت عملگر فعلی از اولویت عملگر بالای پشته A کمتر بود از پشته A آنقدر Pop می کنیم تا به عملگری برسیم که اولویت آن از عملگر فعلی بیشتر باشد
6-آیا پیمایش جمله ورودی پایان یافته
1-6-خیر، اشاره گر کاراکتر را یکی کم کن و به مرحله 3 برو
2-6- بلی به مرحله بعد برو
7- اگر پشته A خالی نیست تمام عناصر آنرا Pop و به پشته B اضافه کن
8- پشته B را خالی کن و هر کاراکتر Pop شده را در خروجی درج کن
---------------------------------
تابع عملگر
-پرانتز بسته تحت هر شرایطی در پشته درج می شود یعنی اولویت آن از همه عملگر ها بیشتر است
-پرانتز باز همیشه تمام عناصر پشته را Pop می کند تا به یک پرانتز بسته برسد و بعد از آنکه پرانتز بسته pop شد به سراغ کاراکتر بعدی می رویم
-اولویت ضرب و تقسیم از جمع و منها بیشتر است
-اولویت دو عملگر یکسان مانند -+،++،--،-+،*/،//،**،*/ کمتر است یعنی مثلا + روی - یا + قرار نمی گیرد
اگر تابع عملگر را بصورت( Eval(OP1,OP2 فرض کنیم که OP1 عنصر ورودی و OP2 عنصر بالای پشته باشد آنرا می توانید به صورت زیر بنویسید


Eval(OP1,OP2)=True If OP1<OP2
Eval(OP1,OP2)=False If OP1>OP2
Eval(OP1,OP2)=False If OP1=Op2
Eval(')',OP)=False
Eval(OP,'(')=True
Eval(OP,')')=False
تابع Eval در صورتی که True بود عملیات Pop انجام می شود تا زمانیکه False شود یا رشته تمام شود و در صورتی که False باشد عمل push انجام می شود
دقت کنید که ) یا ( در پشته B درج نمی شود
این الگوریتم راه حل بازگشتی ساده دیگری نیز دارد و همینطور شما می توانید به جای استفاده از پشته دوم رشته را از انتها در زمان پردازش چاپ کنید
لطفا روش را بررسی کنید و اگر سوالی داشتید بپرسید (امیدوارم جایی اشتباه نکرده باشم :) )
موفق باشید

سلام!
استاد گرامی! پرانتزها چی میشه؟!
چون قراره جمله‌‌ای که پرانتز داره با رعایت اولویت بی پرانتز کنه دیگه!

ali_fbi
سه شنبه 03 آبان 1390, 02:39 صبح
سلام دوست من

ممنون از راهنمایی خوبتون

میشه یکم در مورد استفاده از پرانتز توضیح بدین ؟

اولویت پرانتز ها چطوری هست و چطور کار می کند ؟