PDA

View Full Version : سوال: داخلی ترین پرانتز درعبارت infix



helma20
چهارشنبه 27 آذر 1387, 22:13 عصر
می شه لطفا راهنماییم کنید که چه طور می شه داخلی ترین پرانتز در یک عبارت infix را پیدا کرد؟

Ati2008
پنج شنبه 28 آذر 1387, 00:17 صبح
سلام
من خودم هم خیلی خوب بلد نیستم ...
ولی یه چیزی به ذهنم رسید.
چون تو یه عبارت محاسباتی پرانتز ها به صورت جفت هستند.یعنی اگه پرانتزی باز میشه حتما بسته هم میشه.
پس تو یه عبارت infix اگه ما پرانتز های باز رو از اول بخونیم تا جایی که به اولین پرانتز بسته برسیم، عبارت داخل آخرین پرانتز باز خونده شده و اولین پرانتز بسته ،داخلی ترین پرانتز در عبارت خواهد بود.
امید وارم کمک کرده باشم.:لبخندساده:

helma20
جمعه 29 آذر 1387, 12:28 عصر
آره من هم همچین چیزی به ذهنم رسید امابرای بعضی از عبارت ها نمی شه مثل عبارت زیر

a (2(2+3)+((9*8)-(10*5))) a
طبق چیزی که شما می گویید داخلی ترین پرانتز می شود 2+3 اما داخلی ترین پرانتز 9*8 است
حتما راه حل صحیح تر دیگه هم هست
کسی می تونه کمک کنه؟؟؟؟؟؟؟

...StacK...
جمعه 29 آذر 1387, 13:35 عصر
این راهی که میگم فکر میکنم کامل باشه

شما نگاه کن کدوم پرانتز () بیشترین حمایت رو از پرانتز های باز داره

یعنی پرانتز هایی که هنوز بسته نشده اند-همین عبارت خودتونا نگاه کنید:


a (2(2+3)+((9*8)-(10*5))) a

3+2 یک حامی داره.

8*9 دو حامی داره.

5*10 هم دو حامی داره.

حالا بسته به جایگاه حق تقدم ما داخلی ترین پرانتر رو 8*9 در نظر میگیرم.

امیدوارم درک کرده باشی.

به هر حال این نظر من بود که به درستی جواب هم میده....

اگر کسی راه حل بهتری داره .بگه ما هم استفاده کنیم.

helma20
جمعه 29 آذر 1387, 14:55 عصر
راه حل شما ظاهرا درسته مثال نقضی نمی شه براش زد
اما برنامه اش خیلی پیچیده می شه

من می گم خب وقتی به یه پرانتز رسیدی برو جلو ببین بسته شده ؟
حالا میاد می رسه با پرانتز بعد از 2+3 که بسته شده
حالا از کجا بفهمه این پرانتز که بسته شده مال کدوم پرانتز باز هست
چه شرطی باید بگذارم ؟
خییییییییلی درد سر داره
اما تا حالا این تنها راه درست بوده

helma20
جمعه 29 آذر 1387, 22:37 عصر
کسی راه حل دیگه ای نداره؟

Nima_NF
جمعه 29 آذر 1387, 23:32 عصر
راه هایی که دوستان گفتند درست هست، با کمی تغییر به این شکل می توانید عمل کنید:

به ترتیب شروع می کنید به خواندن پرانتز های " ) " و در یک متغیر (مثلا counter) یک واحد اضافه می کنید، و هر وقت به " ( " رسیدید یک واحد کم می کنید.
متغیری نیز برای ماکسیمم تعداد پرانتز ها اختصاص دهید و در شروع آن را صفر قرار دهید (متغیری maxPar)

در هر مرحله که یک واحد به جلو می روید 2 مورد زیر را نیز ذخیره کنید:

1- عددی که از counter در خانه کنونی بدست می آید اگر بیشتر از مقدار کنونی maxPar است آن را جایگزین کنید.

2- اگر مورد یک درست بود و maxPar تغییر کرده است، شماره کارکتری که درحال خواندن هستید را ذخیره کنید تا بعدا از آن استفاده کنید (مثلا beginPar).

مثلا به این شکل قبل از 9*8 و همین طور قبل از 10*5 مقدار maxPar شما 3 می شود، که نشاندهنده این است که هر دو داخلی ترین هستند، اگر اولویت برایتان از چپ به راست است، چون مقدار کنونی maxPar قبل از 9*8 به 3 شده است، پس دیگر تا زمانی که بزرگتر از آن پیدا نشده است داخلی ترین است.

وقتی کل رشته را پردازش کردید، از مکان beginPar شروع کنید به خواندن تا به پرانتز بسته برسید، این پرانتز داخلی شماست.