توابع تبدیل 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:
کجا بودی اونزمان که بگی اینا رو 😀
ولی آسونترین درس ما که همین بود سخت ترینش برنامه نویسی پیشرفته و ریاضی 1 😥 😥 😥
الان که تموم شد رفت دیگه …
سلام آقا امین گل
خدا رو شکر شما فارغ التحصیل شدی رفت! ما الان درگیر ریاضی 2 … خخخخ
سلام ممنون که اینو گزاشتین. آیا شما از کتابخانه یا فریمورک استفاده کرده اید؟
ممنون میشم از خط 1 تا 7 تصویر اول را توضیح دهید.
با تشکر از شما
سلام امیر عزیز
اگر منظورتان داخل این کد هست خیر از کتابخانه خاصی استفاده نشده است
خط 3: تمامی پرانتز ها و فاصله ها را حذف می کند تا صرفا عملگر و عملوند بماند
خط 5: با توجه به اینکه پیمایش باید از آخر باشد رشته را برعکس می کنیم (در نتیجه پیمایش از اول به آخر رو در حلقه foreach داریم)
خط 7: یک Stack با آرایه ها ایجاد می کنیم
سلام میشه ی کد کامل از توازن علامتهای دوتایی همراه با عملگر هاروی پشته همراه باتوضیح مختصر بدید