سلام استاد من این کد رو نوشتم میخوام اشکالش رو بگیرم. سوالش این هست
رشتهای شامل کاراکترهای (
، )
، {
، }
، [
، ]
داریم. میخواهیم ببینیم پرانتزگذاری در این رشته معتبر است یا خیر.
این رشته در صورتی معتبر است که:
ورودی
در یک خط از ورودی استاندارد، رشتهی موردنظر وارد میشود. توجه داشته باشید که این رشته میتواند خالی باشد.
خروجی
در یک خط از خروجی استاندارد، در صورتی که پرانتزگذاری به درستی صورت گرفته است، YES
و در غیر این صورت، NO
را چاپ کنید.
<?php
$str=readline();
$i=0;
$stack=array();
$top=-1;
$flag=true;
while ($i<strlen($str)){
if ($str[$i]=='(' || $str[$i]=='{' ||$str[$i]=='[')
{
$top++;
$stack[$top]=$str[$i];
}
else {
if ($top==-1) {echo 'NO'; $flag=false;break; }
if (($str[$i]==')' && $stack[$top]=='(') ||($str[$i]=='}' && $stack[$top]=='{') ||($str[$i]==']' && $stack[$top]=='['))
$top--;
else{
echo 'NO'; $flag=false;break; }
}
$i++;
}
if ($flag==true && $top==-1)
echo 'YES';
else
echo 'NO';
وقتی ورودی (( میدم باید جواب noباشه ولی به جای یک no دوتا چاپ میکنه اگر میشه اشکالش رو بهم بگید ممنون
سلام
متاسفانه فرصت نکردم الان کد رو بررسی کنم ولی به صورت کلی برای حل این مسئله استفاده از استک یه انتخاب خوبه و درسته.
اگر دو تا no چاپ میشه خیلی راحت مقدار شرط ها رو var_dump کن ببین چرا داخل اون شرط ها مقدار no چاپ میشه و مقادیر متغیر ها رو بررسی کن. اصطلاها باید trace کنی کدت رو و ببینی چه اتفاقی می افته دقیق ...
سلام کسب و کار، واقعا یاد ساختمان داده به خیر:-)
یه نگاه انداختم بنظرم خودتم میدونی فقط یه خورده احتمالا خسته بودی دقت نکردی یه بار بررسی کن ولی با دیباگر قلم و کاغذ خیلی لذت بخشه حالامنم یه بررسی کردم پس بریم سراغ کد شما :
$top=-1;
$flag=true;
ورودی هم (( دو تا پرانتز بسته
حلقه(i<strlen($str$بررسی میکنه میگه طول رشته از ۰ بزرگتره؟ بله پس میاد داخل حلقه حالا چون شرط اول، حداقل یکی از اینایی که مشخص کردین نبود میره واسه نقضش و top تغییری نمی کنه و برابر با منفی ۱ باقی میمونه پس :
if ($top==-۱) { // شرط درسته پس میاد داخل
echo 'NO';// اینجا اولین نه چاپ میشه
$flag=false; // اینجا پرچم شمااز1 به 0 تغییر میکنه
break;// واینجاهم از حلقه میپره بیرون
}
حالا از حلقه زده بیرون و مقدار پرچم false شده و بالای پشته هم همون منفی ۱ میریم واسه قطعه اخر
if($flag==true && $top==-۱)// اینجا و(&&) گزاشتی پس چون پرچم مقدار دیگه ای داره بله چاپ نمیشه
echo 'YES';
else
echo 'NO'; // و برای بار دوم هم میگن رفته گلاب بیاره وباز هم می گوید نه
تصحیحش با شما :-)
ممنون بابت این سوال خاطره انگیز
سلام استاد. ممنون بابت وقتی که گذاشتید. الان با این ورودی [) امتحان کردم باز هم به خطا خوردم دوتا NO چاپ کرد و برای ورودی (( هم YES چاپ کرد فکر کنم حسابی خسته ام.-)
اگر برای ((، Yes چاپ میکنه دو حالت داره
حالت اول مفسر php هم خستس :-)حالت دوم اون خطی که داره ورودی میگیره ممکنه چیز دیگه هم دریافت کنه که باعث چنین برداشتی میشه و گرنه برای (( حتما باید NoNo چاپ بشه
https://wtools.io/php-sandbox/b۱w۸
برای [) هم درسته مثل همون بالایی باید NoNo چاپ بشه :-)