💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۱۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۴ we are best
درخواست راهنمایی
جامعه پی اچ پی ایجاد شده در ۲۰ خرداد ۱۳۹۹

سلام استاد من این کد رو نوشتم میخوام اشکالش رو بگیرم. سوالش این هست

رشته‌ای شامل کاراکترهای (، )، {، }، [، ] داریم. می‌خواهیم ببینیم پرانتزگذاری در این رشته معتبر است یا خیر.

این رشته در صورتی معتبر است که:

  1. هر پرانتز بازی با پرانتز مربوط به خودش بسته شود.
  2. پرانتزهای باز با ترتیب درستی بسته شوند.

ورودی

در یک خط از ورودی استاندارد، رشته‌ی موردنظر وارد می‌شود. توجه داشته باشید که این رشته می‌تواند خالی باشد.

خروجی

در یک خط از خروجی استاندارد، در صورتی که پرانتزگذاری به درستی صورت گرفته است، 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 چاپ کرد فکر کنم حسابی خسته ام.-)

we are best ۲۱ خرداد ۱۳۹۹، ۱۱:۵۵

اگر برای ((، Yes چاپ میکنه دو حالت داره

حالت اول مفسر php هم خستس :-)حالت دوم اون خطی که داره ورودی میگیره   ممکنه چیز دیگه هم دریافت کنه که باعث چنین برداشتی میشه و گرنه برای (( حتما باید NoNo چاپ بشه 

https://wtools.io/php-sandbox/b۱w۸

برای [)  هم درسته مثل همون بالایی  باید NoNo چاپ بشه :-)

مهرداد ۲۱ خرداد ۱۳۹۹، ۱۲:۵۳