توابع تبدیل prefix و postfix به infix

توابع تبدیل 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)

امیدوارم توابع در گرفتن نمره کمکتون کنه!

توابع تبدیل prefix و postfix به infix

5 thoughts on “توابع تبدیل prefix و postfix به infix

  1. یادش بخیر چه زمانی بود:lol:
    کجا بودی اونزمان که بگی اینا رو 😀
    ولی آسونترین درس ما که همین بود سخت ترینش برنامه نویسی پیشرفته و ریاضی ۱ 😥 😥 😥
    الان که تموم شد رفت دیگه …

    1. سلام آقا امین گل
      خدا رو شکر شما فارغ التحصیل شدی رفت! ما الان درگیر ریاضی ۲ … خخخخ

  2. سلام ممنون که اینو گزاشتین. آیا شما از کتابخانه یا فریمورک استفاده کرده اید؟
    ممنون میشم از خط ۱ تا ۷ تصویر اول را توضیح دهید.
    با تشکر از شما

    1. سلام امیر عزیز

      اگر منظورتان داخل این کد هست خیر از کتابخانه خاصی استفاده نشده است
      خط ۳: تمامی پرانتز ها و فاصله ها را حذف می کند تا صرفا عملگر و عملوند بماند
      خط ۵: با توجه به اینکه پیمایش باید از آخر باشد رشته را برعکس می کنیم (در نتیجه پیمایش از اول به آخر رو در حلقه foreach داریم)
      خط ۷: یک Stack با آرایه ها ایجاد می کنیم

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *