توابع تبدیل prefix و postfix به infix
سلام، امروز در سایت شاهد یه کد خاص هستیم! مخاطب خاص این کد دانشجویانی هستند که در دانشگاه درس ساختمان داده دارند. prefix (پیشوندی) و postfix (پسوندی) دو حالت از ذخیره عبارت های ریاضی هستند (اگه اشتباه نکنم و درسمو درست خونده باشم!) که تبدیل آن ها به infix (میانوندی) کمی زمانبر هست. چندی پیش درگیر حل تمرین ساختمان داده بودیم که به چند مسئله بزرگ و نسبتا طولانی برخوردیم! این شد که توابع زیر نوشته شدند.
تابع تبدیل prefix به infix (پیشوندی به میانوندی):
function prefix_to_infix( $prefix ){ // snippets.ir $prefix = str_replace(array(' ', '(', ')'), '', $prefix); $prefix = strrev($prefix); $stack = array(); foreach( str_split($prefix) as $chr){ if(in_array($chr, array('+', '-', '*', '/', '^'))){ $_1th = array_pop($stack); $_2th = array_pop($stack); $stack[] = "($_1th $chr $_2th) "; } else $stack[] = $chr; } return substr(current($stack), 1, strlen(current($stack)) - 3); } echo prefix_to_infix('*+a-bc/-de+-fgh'); // (a + (b - c) ) * ((d - e) / ((f - g) + h) )
تابع تبدیل postfix به infix (پسوندی به میانوندی):
function postfix_to_infix( $postfix ){ // snippets.ir $postfix = str_replace(array(' ', '(', ')'), '', $postfix); $stack = array(); foreach( str_split($postfix) as $chr){ if(in_array($chr, array('+', '-', '*', '/', '^'))){ $_2th = array_pop($stack); $_1th = array_pop($stack); $stack[] = "($_1th $chr $_2th) "; } else $stack[] = $chr; } return substr(current($stack), 1, strlen(current($stack)) - 3); } echo postfix_to_infix('( (A B *) (C D /) +)'); // (A * B) + (C / D)
امیدوارم توابع در گرفتن نمره کمکتون کنه!
5 thoughts on “توابع تبدیل prefix و postfix به infix”
یادش بخیر چه زمانی بود:lol:
کجا بودی اونزمان که بگی اینا رو 😀
ولی آسونترین درس ما که همین بود سخت ترینش برنامه نویسی پیشرفته و ریاضی ۱ 😥 😥 😥
الان که تموم شد رفت دیگه …
سلام آقا امین گل
خدا رو شکر شما فارغ التحصیل شدی رفت! ما الان درگیر ریاضی ۲ … خخخخ
سلام ممنون که اینو گزاشتین. آیا شما از کتابخانه یا فریمورک استفاده کرده اید؟
ممنون میشم از خط ۱ تا ۷ تصویر اول را توضیح دهید.
با تشکر از شما
سلام امیر عزیز
اگر منظورتان داخل این کد هست خیر از کتابخانه خاصی استفاده نشده است
خط ۳: تمامی پرانتز ها و فاصله ها را حذف می کند تا صرفا عملگر و عملوند بماند
خط ۵: با توجه به اینکه پیمایش باید از آخر باشد رشته را برعکس می کنیم (در نتیجه پیمایش از اول به آخر رو در حلقه foreach داریم)
خط ۷: یک Stack با آرایه ها ایجاد می کنیم
سلام میشه ی کد کامل از توازن علامتهای دوتایی همراه با عملگر هاروی پشته همراه باتوضیح مختصر بدید