به طور کلی عبارات ریاضی را به سه صورت می توان نوشت :
میانوند Infix
پیشوند Prefix
پسوند Postfix
عبارات میانوند همان عبارات معمول بین انسان ها هستند مثلا:
A+B*C
عبارات پسوند و پیشوند تبدیل شده همان عبارت میانوند به صورت اول عملگر یا آخر عملگر می باشند.
مثلا همان عبارت بالا به صورت پیشوند
+A*BC
یا به صورت پسوند
ABC*+
حالا برای ارزیابی یک عبارت به یک سری پیشنیاز ها لازم است :
1. جهت محاسبه - معمولا چپ به راست
2. تقدم عملگرها (Operators) - یعنی اگر از پرانتز گذاری استفاده نشده بود کدام عملگر ابتدا عمل می کند.
3. جهت تقدم - مثلا اگر در یک عبارت چند تا عمل ضرب بود اول سمت چپی عمل می کند یا سمت راستی.
4. فرمت عملوندها (operands) - یعنی متغییر ها با چه فرمتی تعریف می شوند یا چه کاراکترهایی برای تعریف متغییر ها مجاز است (در اکثر زبان های برنامه نویسی : کاراکتر اول از حروف انگلیسی یا _ و بقیه کاراکترها عددی یا حرفی هستند)
خوب حالا چرا از عبارت های پسوندی یا پیشوندی استفاده می کنیم؟
دلیل آن سادگی محاسبات این عبارات توسط کامپیوتر است. مثلا عبارت پسوند به راحتی با استفاده از پشته قابل محاسبه است. تنها با چند خط کد نویسی.
نکته مهمی که در این جا باید ذکر شود این است که عبارت پسوندی یا پیشوندی به هیچ وجه شامل پرانتز نمی باشد و این عبارت میانوند است که می تواند پرانتز داشته باشد.
در واقع شما با تبدیل عبارت میانوند به پسوند یا پیشوند عملا بحث پردازش پرانتز را منتفی می کنید.
برای مثال با فرض این که ثابت های عددی، متغییرها ، عملگرها، پرانتزباز و پرانتز بسته را یک نشانه (Token) بنامیم الگوریتم تبدیل یک عبارت میانوند به پسوند به صورت زیر است(به نقل از کتاب ساختمان داده ها در C انتشارات علوم رایانه):
--------------------------------------------------------------------------------------------------
1. یک پشته خالی ایجاد کنید.
2. تازمانی که خطای رخ نداده یا به انتهای عبارت نرسیده ایم کارهای زیر را انجام بده2-1. نشانه بعدی را از عبارت استخراج کن (این کار توسط تحلیلگر لغوی انجام می شود)
2-2. اگر نشانه
2-2-1. پرانتز باز است : آن را در پشته قرار بده.
2-2-2. پرانتز بسته است : عناصر پشته را آنقدر حذف کنید و در عبارت پسوندی قرار دهید تا به پرانتز باز برسید (اگر پرانتز باز پیدا نشد خطا وجود دارد)
2-2-3. عملگر است :اگر پشته خالی است یا تقدم این عملگر از تقدم عملگر بالای پشته بیشتر استآن را در پشته قرار دهید وگرنه عنصر بالای پشته را حذف کنید و در عبارت پسوندی قرار دهید.این کار را برای عملگر جدید موجود در بالای پشته تکرار کنید.
2-2-4.عملوند است : آن را در عبارت پسوندی قرار دهید.
3. وقتی به انتهای عبارت میانوند رسیدید عناصر پشته را حذف کنید و در عبارت پسوندی قرار دهید تا پشته خالی شود.
--------------------------------------------------------------------------------------------------
این هم چند تا مثال :
A+B
AB+
A+B-C
AB+C-
(A+B)*(C-D)
AB+CD-*
A^B*C-D+E/F/(G+H)
AB^C*D-EF/GH+/+
((A+B)*C-(D_E))^(F+G)
AB+C*DE--FG+^
A-B/(C*D^E)
ABCDE^*/-
عبارات پیشوندی یا پسوندی به خودی خود تنها برای محاسبه نتیجه یک عبارت به کار می روند و نه حل یک معادله. در واقع این روشها برای بدست آوردن یک فرمت استاندارد از معادله ورودی بیشتر کاربرد دارند تا حل آن. معمولا برای حل معادلات مخصوصا از نوع غیر خطی توسط کامپیوتر از روش های محاسبات عددی استفاده میشود.
حالا برای ارزیابی یک عبارت دو مرحله اصلی و اولیه وجود دارد :
1 . ابتدا عبارت تحلیل شده ، اعداد و متغییرها جداسازی شوند- این کار توسط فاز تحلیل لغوی (lexical Analyzer) در یک کامپایلر انجام می شود. در این مرحله خطاهای لغوی مشخص می شود - مثلا عددی به صورت زیر در رشته ورودی وجود داشته باشد 15a23
2. در مرحله دوم شما باید با پیشنیازهایی که در بالا ذکر کردم اعداد و متغییر های جدا شده به عنوان یک عبارت در نظر گرفته و حل نمایید (Syntax Analyzer) - در این مرحله اگر خطای نحوی موجود باشد مشخص می شود - مثلا یک پرانتز جا افتاده باشد یا دو عملگر پشت سر هم باشند
x^2+5-*X
نکته آخر این که با روشهای آزمون خطا می توان به طور نسبی چنین سیستمی را طراحی کرد ولی راه دقیق ، بدون خطا و اصولی آن که تمام جوانب را در نظر می گیرد و فرمت معادله ورودی برای آن مهم نیست همان است که در کتاب های طراحی کامپایلر پیدا خواهید کرد.
برای اطلاعات بیشتر در مورد انواع عبارات کتاب های ساختمان داده ، حل معادلات توسط کامپیوتر کتاب های محاسبات عددی و تحلیل عبارات ریاضی توسط کامپیوتر کتاب های طراحی کامپایلر را ببینید.
موفق باشید.